精通Hibernate:映射對象標識符
Java語言按內(nèi)存地址來識別和區(qū)分同一個類的不同對象,而關(guān)系數(shù)據(jù)庫按主鍵值來識別和區(qū)分同一個表中的不同記錄。Hibernate使用對象標識符(OID)來建立內(nèi)存中的對象和數(shù)據(jù)庫中記錄的對應(yīng)關(guān)系,對象的OID和數(shù)據(jù)庫表的主鍵對應(yīng)。
自然主鍵(具有業(yè)務(wù)含義的字段),如用戶自定義的NAME;而代理主鍵不具備業(yè)務(wù)含義的字段,該字段一般取名為“ID”。
在java語言中,“==”判斷的是引用,“equals”判斷的是值。因此,
一、代理主鍵的映射
為了保證持久化對象的OID的唯一性和不變性,通常有Hibernate或底層數(shù)據(jù)庫來給OID復(fù)制。因此,可以把持久化類的OID的setId()方法設(shè)置為Private類型以禁止Java應(yīng)用程序隨便修改OID;而把getId()方法設(shè)為public類型,使得Java應(yīng)用程序都可以讀取持久化對象。
在對象關(guān)系映射文件中,<id>元素用來設(shè)置對象標識符,例如:
- <id name="id" type="long" column="ID">
 - <generator class="increment"/>
 - </id>
 
二、自然主鍵的映射
自然主鍵是具有業(yè)務(wù)含義的主鍵。應(yīng)盡量避免使用自然主鍵。
映射單個自然主鍵name
- <id name="name" column="NAME" type="string">
 - <generator class="assigned"/>
 - </id>
 
在以上代碼中,標識符生成策略為“assigned”,表示有應(yīng)用程序為name屬性賦值。
可以使用
- Customer customer=new Customer();
 - session.getIdentifier(customer);
 
來返回Customer的OID,以上返回的是Customer對象的name屬性。
映射復(fù)合自然主鍵:
- <composite-id>
 - <key-property name="name" column="NAME" type="string">
 - <key-property name="companyId" column="COMPANY_ID" type="long">
 - </composite-id>
 
- Customer customer=new Customer();
 - customer.setName("Tom");
 - customer.setCompanyId(new Long(11));
 - session.saveORupadate(customer);//保存和更新指定記錄
 - session.get(Customer.class,customer);//獲取NAME字段為Tom并且COMPANY_ID字段為11的記錄
 
映射復(fù)合自然主鍵的另一種方式為先定義單獨的主鍵類。如下:
- package mypack;
 - public class CustomerId implements java.io.Serializable {
 - private String name;
 - private Company company;
 - public CustomerId() {
 - }
 - public CustomerId(String name, Company company) {
 - this.name = name;
 - this.company = company;
 - }
 - public String getName() {
 - return this.name;
 - }
 - public void setName(String name) {
 - this.name = name;
 - }
 - public Company getCompany() {
 - return this.company;
 - }
 - public void setCompany(Company company) {
 - this.company = company;
 - }
 - }
 
在Customer類中不必定義name和companyId屬性,而是定義customerId屬性。
映射代碼如下:
- <composite-id name="customerId" class="mypack.CustomerId" >
 - <key-property name="name" column="NAME" type= "string" />
 - <key-property name="companyId" column="COMPANY_ID" type="long"> </composite-id>
 
三、自然主鍵(存在外鍵)的映射
假設(shè)上例中COMPANY_ID還作為外鍵參照COMPANYS表,那么Customer類中除了定義customerId屬性,還必須定義company屬性:
- private CustomerId customerId;
 - private Company company;
 
映射company屬性的代碼:
- <composite-id name="customerId" class="mypack.CustomerId" >
 - <key-property name="name" column="NAME" type= "string" />
 - <key-property name="companyId" column="COMPANY_ID" type="long">
 - </composite-id>
 - <many-to-one name="company" class="mypack.Company" column="COMPANY_ID" insert="false" update="false"/>
 
以上<many-to-one>元素的insert和update屬性都是false,表明當Hibernate保存或者更新Customer對象時,會忽略company屬性。
也可以用<key-many-to-one>元素來映射company屬性:
- <composite-id name="customerId" class="mypack.CustomerId" >
 - <key-property name="name" column="NAME" type= "string" />
 - <key-many-to-one name="company" class="mypack.Company" column="COMPANY_ID" />
 - </composite-id>
 
原文鏈接:http://blog.csdn.net/yu422560654/article/details/7085603
【編輯推薦】


















 
 
 





 
 
 
 