1. 程式人生 > >Hibernate 基於外來鍵一對一對映(單雙向)

Hibernate 基於外來鍵一對一對映(單雙向)

主要內容
對映關聯關係
一對一關聯對映的策略
基於外來鍵的單(雙)一對一關聯對映
基於主鍵的單(雙)一對一關聯對映

基於外來鍵的單向一對一實際上是多對一關聯對映的特例
採用<many-to-one>標籤,指定多的一端的unique=true,這樣就限制了多端的多重性為一

單向的表示只有一端知道有聯絡,知道的聯絡的為主控端。不知道聯絡的為被控端。

public class Account {

	private Integer id;
	private String name;
	
	//主控端引用被控端的物件
	private Address address;
	
	public Account(){
		
	}

	/**
	 * @return the id
	 */
	public Integer getId() {
		return id;
	}

	/**
	 * @param id the id to set
	 */
	public void setId(Integer id) {
		this.id = id;
	}

	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param name the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * @return the address
	 */
	public Address getAddress() {
		return address;
	}

	/**
	 * @param address the address to set
	 */
	public void setAddress(Address address) {
		this.address = address;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Account [id=" + id + ", name=" + name
				+ "]";
	}
	
	
	
}


public class Address {

	private int id;
	private String address;
	
	public Address(){
		
	}

	/**
	 * @return the id
	 */
	public int getId() {
		return id;
	}

	/**
	 * @param id the id to set
	 */
	public void setId(int id) {
		this.id = id;
	}

	/**
	 * @return the address
	 */
	public String getAddress() {
		return address;
	}

	/**
	 * @param address the address to set
	 */
	public void setAddress(String address) {
		this.address = address;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Address [address=" + address + ", id=" + id + "]";
	}
	
	
	
}

對映檔案
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="Account" table="acc_table01">
		<!-- 生成物件唯一的OID標示符 -->
		<id name="id" column="id" type="integer">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<!-- 
			通過Many-to-One 新增唯一屬性約束,建立一對一的關係
		 -->
		 <many-to-one name="address" column="address_id" unique="true"></many-to-one> <span style="color:#ff0000;">//這個是外來鍵</span>
	</class>

</hibernate-mapping>

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="Address" table="address_table01">
		<!-- 生成物件唯一的OID標示符 -->
		<id name="id" column="id" type="integer">
			<generator class="native"/>
		</id>
		<property name="address"/>
	
	</class>

</hibernate-mapping>




基於外來鍵的雙向一對一對映,兩邊都持有物件的引用

javabean如下:

public class Account {

	private Integer id;
	private String name;
	
	//主控端引用被控端的物件
	
	private Address address_id;
	
	public Account(){
		
	}

	/**
	 * @return the id
	 */
	public Integer getId() {
		return id;
	}

	/**
	 * @param id the id to set
	 */
	public void setId(Integer id) {
		this.id = id;
	}

	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param name the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}

//	/**
//	 * @return the address
//	 */
//	public Address getAddress() {
//		return address;
//	}
//
//	/**
//	 * @param address the address to set
//	 */
//	public void setAddress(Address address) {
//		this.address = address;
//	}
	

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Account [id=" + id + ", name=" + name
				+ "]";
	}

	/**
	 * @return the address_id
	 */
	public Address getAddress_id() {
		return address_id;
	}

	/**
	 * @param addressId the address_id to set
	 */
	public void setAddress_id(Address addressId) {
		address_id = addressId;
	}
	
	
	
}

public class Address {

	private int id;
	private String address;
	
	//宣告一個對主控端物件的引用
	private Account account;
	
	public Address(){
		
	}

	/**
	 * @return the id
	 */
	public int getId() {
		return id;
	}

	/**
	 * @param id the id to set
	 */
	public void setId(int id) {
		this.id = id;
	}

	/**
	 * @return the address
	 */
	public String getAddress() {
		return address;
	}

	/**
	 * @param address the address to set
	 */
	public void setAddress(String address) {
		this.address = address;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Address [address=" + address + ", id=" + id + "]";
	}

	public void setAccount(Account account) {
		this.account = account;
	}

	public Account getAccount() {
		return account;
	}
	
	
	
}

對映檔案:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="Account" table="acc_table02">
		<!-- 生成物件唯一的OID標示符 -->
		<id name="id" column="id" type="integer">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<!-- 
			通過Many-to-One 新增唯一屬性約束,建立一對一的關係
		 -->
		<many-to-one name="address_id" column="address_id" unique="true"></many-to-one>
	</class>

</hibernate-mapping>


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="Address" table="address_table02">
		<!-- 生成物件唯一的OID標示符 -->
		<id name="id" column="id" type="integer">
			<generator class="native"/>
		</id>
		<property name="address"/>
		  <!-- one-to-one對映一對一關聯     property-ref屬性:指定反向屬性引用 -->
		<one-to-one name="account" property-ref="address_id"></one-to-one>
		
	</class>

</hibernate-mapping>