Hibernate使用Person对象

开发 后端
这里介绍Hibernate使用Person对象的version字段进行并发控制,Hibernate将会执行乐观锁方案,根据这个方案,Hibernate在保存对象之前会检查对比对象的version值和数据库中相应数据的version值。

Hibernate有很多值得学习的地方,这里我们主要介绍Hibernate使用Person对象,包括介绍Person对象还缺少的是equals()方法和hashCode()方法等方面。

Hibernate映像文件指明了Person的id字段代表了数据库中的ID列(也就是说,它是PERSON表的主键)。包含在id标签中的unsaved-value="null"属性告诉Hibernate使用id字段来判断一个Person对象之前是否被保存过。ORM框架必须依靠这个来判断保存一个对象的时候应该使用SQL的INSERT字句还是UPDATE字句。在这个例子中,Hibernate假定一个新对象的id字段一开始为null值,当它第一次被保存时才id才被赋予一个值。generator标签告诉Hibernate当对象第一次保存时,应该从哪里获得指派的id。在这个例子中,Hibernate使用数据库序列作为产生唯一id的来源。最后,version标签告诉Hibernate使用Person对象的version字段进行并发控制。Hibernate将会执行乐观锁方案(optimistic locking scheme),根据这个方案,Hibernate在保存对象之前会检查对比对象的version值和数据库中相应数据的version值。

我们的Person对象还缺少的是equals()方法和hashCode()方法的实现。既然这是一个持久化对象,我们并不想依赖于这两个方法的缺省实现,因为缺省实现并不能分辨代表数据库中同一实体的不同实例。一种简单而又显然的实现方法是利用id字段来进行equal()方法的比较以及生成hashCode()方法的结果。

public boolean equals(Object o) {  
if (this == o) return true;   
if (o == null || !(o instanceof Person))   
return false;  
Person other = (Person)o;   
if (id == other.getId()) return true;   
if (id == null) return false;  
// equivalence by id   
return id.equals(other.getId());  
}  
public int hashCode() {  
if (id != null) {   
return id.hashCode();   
}  
else {  
return super.hashCode();   
}  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

不走运的是,这个实现存在着问题。当我们首次创建Person对象的时候id的值是null,这意味着任何两个没有被保存的Person对象都将被认为是等价的。如果我们想创建一个Person对象并把它放到Set数据结构中,再创建了一个完全不同的Person对象也把它放到同一个Set里面,事实上第2个Person对象并不能被加入。这是因为Set会断定所有未经保存的对象都是相同的。

你可能会试探着去实现一个只使用被设置过的id的equals()方法。毕竟,如果两个对象都没有被保存过,我们可以假定它们是不同的对象。这是因为在它们被保存到数据库的时候,它们会被赋予不同的主键。

public boolean equals(Object o) {   
if (this == o) return true;  
if (o == null || !(o instanceof Person)) return false;  
Person other = (Person)o;  
// unsaved objects are never equal   
if (id == null || other.getId() == null) return false;   
return id.equals(other.getId());  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

这里有个隐藏的问题。Java的Collection框架在它的生命周期中需要基于不变字段的equals()和hashCode()方法。换句话来说,当一个对象处在Collection中的时候,你不可以改变equals()和hashCode()的返回值。举个例子,下面这段程序:

Person p = new Person();  
Set set = new HashSet();  
set.add(p);  
System.out.println(set.contains(p));  
p.setId(new Long(5));  
System.out.println(set.contains(p));   
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

以上介绍Hibernate使用Person对象。

【编辑推荐】

  1. Hibernate Util简单讨论
  2. 详解优化Hibernate性能经验
  3. 概述Hibernate dbcp连接池使用方法
  4. 浅析Hibernate.cfg.xml配置
  5. Hibernate Shard基础分析
责任编辑:佚名 来源: IT168
相关推荐

2012-02-08 14:24:35

HibernateJava

2009-09-29 10:46:58

Hibernate领域

2009-09-25 13:14:58

Hibernate C

2009-09-22 11:27:41

模型对象Hibernate

2009-09-23 13:26:10

Hibernate对象

2009-09-29 16:11:45

Hibernate实现

2009-09-25 14:41:15

Hibernate对象

2012-02-08 12:17:38

HibernateJava

2009-09-24 15:42:44

Hibernate对象

2009-09-23 10:41:10

对象标识符Hibernate

2009-09-29 16:48:42

Hibernate J

2009-09-28 13:43:28

使用Hibernate

2009-09-25 13:55:05

Hibernate使用

2009-09-21 17:23:49

Hibernate使用

2009-09-23 10:28:49

使用Hibernate

2009-06-30 16:52:30

DetchedCrit

2009-06-26 16:31:50

区分不同对象Hibernate

2012-02-08 14:01:18

HibernateJava

2009-06-17 15:06:50

Hibernate实体

2009-06-30 16:41:12

Hibernate的事
点赞
收藏

51CTO技术栈公众号