Hibernate 基於外來鍵一對一對映(單雙向)
阿新 • • 發佈:2019-02-11
主要內容:
對映關聯關係
一對一關聯對映的策略
基於外來鍵的單(雙)一對一關聯對映
基於主鍵的單(雙)一對一關聯對映
基於外來鍵的單向一對一實際上是多對一關聯對映的特例
採用<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>