精通Hibernate:映射对象标识符

开发 后端
Java语言按内存地址来识别和区分同一个类的不同对象,而关系数据库按主键值来识别和区分同一个表中的不同记录。Hibernate使用对象标识符(OID)来建立内存中的对象和数据库中记录的对应关系,对象的OID和数据库表的主键对应。

Java语言按内存地址来识别和区分同一个类的不同对象,而关系数据库按主键值来识别和区分同一个表中的不同记录。Hibernate使用对象标识符(OID)来建立内存中的对象和数据库中记录的对应关系,对象的OID和数据库表的主键对应。

自然主键(具有业务含义的字段),如用户自定义的NAME;而代理主键不具备业务含义的字段,该字段一般取名为“ID”。

在java语言中,“==”判断的是引用,“equals”判断的是值。因此,

一、代理主键的映射

 

为了保证持久化对象的OID的唯一性和不变性,通常有Hibernate或底层数据库来给OID复制。因此,可以把持久化类的OID的setId()方法设置为Private类型以禁止Java应用程序随便修改OID;而把getId()方法设为public类型,使得Java应用程序都可以读取持久化对象。

在对象关系映射文件中,<id>元素用来设置对象标识符,例如:

  1. <id name="id"  type="long" column="ID">  
  2.      <generator class="increment"/>  
  3. </id> 

二、自然主键的映射

自然主键是具有业务含义的主键。应尽量避免使用自然主键。

映射单个自然主键name

  1. <id name="name" column="NAME" type="string">  
  2. <generator class="assigned"/>  
  3. </id> 

在以上代码中,标识符生成策略为“assigned”,表示有应用程序为name属性赋值。

可以使用

  1. Customer customer=new Customer();  
  2. session.getIdentifier(customer); 

来返回Customer的OID,以上返回的是Customer对象的name属性。

映射复合自然主键:

  1. <composite-id>  
  2.   <key-property name="name" column="NAME" type="string">  
  3.   <key-property name="companyId" column="COMPANY_ID" type="long">  
  4. </composite-id> 
  1. Customer customer=new Customer();  
  2. customer.setName("Tom");  
  3. customer.setCompanyId(new Long(11));  
  4. session.saveORupadate(customer);//保存和更新指定记录  
  5. session.get(Customer.class,customer);//获取NAME字段为Tom并且COMPANY_ID字段为11的记录 

映射复合自然主键的另一种方式为先定义单独的主键类。如下:

  1. package mypack;  
  2. public class CustomerId  implements java.io.Serializable {  
  3.      private String name;  
  4.      private Company company;  
  5.  
  6.     public CustomerId() {  
  7.     }  
  8.  
  9.     public CustomerId(String name, Company company) {  
  10.        this.name = name;  
  11.        this.company = company;  
  12.     }  
  13.      
  14.     public String getName() {  
  15.         return this.name;  
  16.     }  
  17.       
  18.     public void setName(String name) {  
  19.         this.name = name;  
  20.     }  
  21.     public Company getCompany() {  
  22.         return this.company;  
  23.     }  
  24.       
  25.     public void setCompany(Company company) {  
  26.         this.company = company;  
  27.     }  

在Customer类中不必定义name和companyId属性,而是定义customerId属性。

映射代码如下:

  1. <composite-id name="customerId" class="mypack.CustomerId" >  
  2.       <key-property name="name" column="NAME"  type= "string" />  
  3.       <key-property name="companyId" column="COMPANY_ID" type="long"> </composite-id> 

三、自然主键(存在外键)的映射

假设上例中COMPANY_ID还作为外键参照COMPANYS表,那么Customer类中除了定义customerId属性,还必须定义company属性:

  1. private CustomerId customerId;  
  2. private Company company; 

映射company属性的代码:

  1. <composite-id name="customerId" class="mypack.CustomerId" >  
  2.       <key-property name="name" column="NAME"  type= "string" />  
  3.       <key-property name="companyId" column="COMPANY_ID" type="long">   
  4. </composite-id>  
  5. <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属性:

  1. <composite-id name="customerId" class="mypack.CustomerId" >  
  2.     <key-property name="name" column="NAME"  type= "string" />  
  3.     <key-many-to-one name="company" class="mypack.Company" column="COMPANY_ID" />  
  4.   </composite-id> 

原文链接:http://blog.csdn.net/yu422560654/article/details/7085603

【编辑推荐】

  1. 精通Hibernate:映射一对多关联关系
  2. 精通Hibernate:对象关系映射基础
  3. 精通Hibernate:第一个Hibernate应用
  4. Hibernate缓存何时使用和如何使用
  5. Hibernate连接Mysql中文乱码处理
责任编辑:林师授 来源: yu422560654的博客
相关推荐

2009-09-23 10:41:10

对象标识符Hibernate

2012-02-08 12:17:38

HibernateJava

2009-08-26 14:01:18

C#标识符

2012-02-08 14:24:35

HibernateJava

2009-10-27 14:20:37

VB.NET动态标识符

2009-09-23 13:26:10

Hibernate对象

2022-07-17 06:57:02

时间戳唯一标识符

2011-03-14 10:17:40

JavaScript

2012-02-08 13:34:08

HibernateJava

2009-06-26 18:07:12

JSF客户端标识符

2009-12-08 19:29:10

PHP生成唯一标识符

2017-04-21 12:30:45

AndroidAndroid O设备标识符

2009-07-21 12:59:25

Scala标识符

2010-01-15 18:17:39

VB.NET动态标识

2023-08-22 08:52:14

Go零值标识符

2023-05-28 00:09:21

2024-06-05 08:47:20

Go语言方式

2023-09-26 07:28:47

2023-03-13 10:01:27

Java注释

2009-07-09 17:02:04

JDK学习笔记数据类型
点赞
收藏

51CTO技术栈公众号