快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
(o instanceof PersistentObject)) { return false; }   PersistentObject other = (PersistentObject)o;   // if the id is missing,   return false   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();   } } public String toString() {   return this.getClass().getName() + "[id=" + id + "]"; } }

现在我们有了一个简单而高效的方法来创建域对象。它们继承了AbstractPersistentObject,这个父类能在它们第一次被创建时自动赋予它们一个id并且恰当的实现了equals()和hashCode()这两个方法。域对象也得到了一个对toString()方法的合理的缺省实现,这个方法可以有选择地被重写。如果这是一个查询例子的测试对象或者例子对象,id值时可以被改变或者被设为null。否则它是不应当被改变的。如果因为某些原因我们需要创建一个继承自其它类的域对象,这个对象就应当实现PersistentObject接口而不是继承抽象类。

Person类现在就简单多了:

public class Person extends AbstractPersistentObject { // Person-specific fields and behavior here}

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

时间:2011-01-04

从上一个例子开始Hibernate映像文件就不会再改变了。我们不想麻烦Hibernate去了解抽象父类,相对的,我们只要保证每个持久化对象的映射文件包含一个id项(和一个被指派的生成器)和一个带有unsaved-value="null"属性的version标签。机敏的读者可能已经注意到,每当一个持久化对象被实例化的时候,它的id值得到了指派。这意味着当Hibernate在内存中创建一个已经保存过的对象时,虽然这个对象是已经存在并从数据库中读取的,它也会得到一个新的id。这不会产生问题,因为Hibernate会接着调用对象的setId()方法,用保存的真实id来替换新分配的id。剩下的id生成器并不是问题,因为实现它的算法是轻量级的(也就是说,它并不牵扯到数据库)。

到现在为止一切都很好,但是我们遗漏了一个重要的细节:如何实现IdGenerator.createId().我们可以为我们理想中的键值生成器(key-generation)算法定义一些标准。

。键值可以不牵扯到数据库而很轻量级的产生

。即使跨越不同的虚拟机和不同机器,键值也要保证唯一性。

。如果可能键值可以由其它程序,编程语言和数据库生成,至少要能和它们兼容。

我们需要的是通用唯一标识符(UUID)。UUID是由标准格式化的16个字节大小的(128位)数字组成的。UUID的字符串版本是像这样的:

2cdb8cee-9134-453f-9d7a-14c0ae8184c6(大家应该可以注意到, Jmatrix目前就是使用的UUID)

里面的字符是数字简单的按字节的16进制表示,横线把数字的不同部分分割开来。这种格式简单而且易于处理,只是36个字符有点儿太长了。因为横线总是被安置在相同的位置,所以可以把它们去掉而把字符的数目减少到32个。用一种更为简洁的表示方法,你可以创建一个byte[16]的数组或是两个8字节大小的长整型(long)来保存这些数字。如果你使用的是java1.5或更高版本,你可以直接使用UUID类,虽然这不是它在内存中最简洁的格式。如果你要获得更多的信息,请参阅Wikipedia 的UUID条目 或 Java UUID参考文档。

对UUID的产生算法有多种实现。既然最终UUID是一种标准格式,我们在IdGenerator类中采用哪一种实现都没有关系。既然无论采用什么算法每个id都会被保证唯一,我们甚至可以在任何时候改变算法的实现或是混合匹配不同的实现。如果你使用的是java1.5或更高版本,最方便的实现是java.util.UUID类。

public cla

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号