快速业务通道

别让Hibernate偷走了你的标识符 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
  return id.hashCode();    } else {     return super.hashCode();    }   } }

这个例子使用id作为equals()方法判断等价的标准以及hashCode()返回哈希值的来源。这就简单了许多。但是,要让它正常工作,我们需要两样东西。首先,我们需要保证每个对象在被保存之前都有一个id值。在这个例子里,当id变量被声明的时候,它就被指派了一个值。其次,我们需要一种判断这个对象是新生成的还是之前保存过的的手段。在我们最早的例子中,Hibernate检查id字段是否为空来判断对象是否时新生成的。既然我们的对象id永远不为空,这个方法显然不再有效。为了解决这个问题,我们可以很容易的配置Hibernate,让它检查version字段,而不是id字段是否为空。version字段是一个更为恰当的用来判断你的对象是否被保存过的指示器。

下面是我们改进过的Person类的Hibernate映射文件。

<?xml version="1.0"?> <hibernate-mapping package="my.package"> <class name="Person" table="PERSON"> <id name="id" column="ID"> <generator class="assigned" /> </id> <version name="version" column="VERSION" unsaved-value="null" /> <!-- Map Person-specific properties here. --> </class> </hibernate-mapping>

别让Hibernate偷走了你的标识符(4)

时间:2011-01-04

注意,id下面的generator标签包含了属性class="assigned".这个属性告诉Hibernate我们不是让数据库指派id值而是在我们的代码里面指派id值。Hibernate会简单地认为即使是新的,没有经过保存的对象也有id值。我们也给version标签新增了一个unsaved-value="null"的属性。这个属性告诉Hibernate应该把version值而不是id值为null作为对象是新创建而成的指示器。我们也可以简单的告诉Hibernate把负值作为对象未经保存的指示器,如果你喜欢把version字段的类型设置为int而不是Integer,这将是很有用的。

我们已经从改用这样的纯净的对象id中获取了不少好处。我们对equals()和hashCode()方法的实现更加简单而且容易阅读。这些方法再也不易出错而且无论在保存对象之前还是之后,它们都能和Collection一起正常工作。Hibernate也能够变的更快一些,这是因为在保存新的对象之前它再也不需要从数据库读取一个序列值。此外,新定义的equals()和hashCode()对于一个包含id对象的对象来说是具有通用性的。这意味着我们可以把这些方法移动到一个抽象的父类当中去。我们不再需要为每一个域对象重新实现equals()和hashCode(),而且我们也不再需要考虑对于一个类来说哪些字段的组合是唯一且不变的。我们只要简单地继承这个抽象类。当然,我们没必要强迫我们的域对象继承一个父类,所以我们定义了一个接口来保证设计的灵活性。

public interface PersistentObject {   public String getId();   public void setId(String id);   public Integer getVersion();   public void setVersion(Integer version); } public abstract class AbstractPersistentObject implements PersistentObject {   private String id = IdGenerator.createId();   private Integer version;   public String getId() { return id; } public void setId(String id) { this.id = id; } public Integer getVersion() { return version; } public void setVersion(Integer version) { this.version = version; } public boolean equals(Object o) {   if (this == o) return true;   if (o == null || !

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号