别让Hibernate偷走了你的标识符
http://tech.ddvip.com 2006年11月20日 社区交流
本文详细介绍别让Hibernate偷走了你的标识符
Person类现在就简单多了:
public class Person extends AbstractPersistentObject { // Person-specific fields and behavior here}从上一个例子开始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参考文档。
责编:豆豆技术应用