概述Hibernate对象标识符
创始人
2024-06-07 20:30:19
0

Hibernate有很多值得学习的地方,这里我们主要介绍对象标识符,包括介绍Hibernate内置的UUID生成器算法等方面。

我们需要的是通用唯一标识符(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类。

  1. public class IdGenerator {   
  2. public static String createId() {   
  3. UUID uuid = java.util.UUID.randomUUID();  
  4. return uuid.toString();  
  5. }  

对不使用java1.5或更高版本的人来说,至少有两种扩展库实现了UUID并且和1.5之前的java版本兼容: Apache Commons ID project 和 Java UUID Generator(JUG) project.它们都在Apache的旗下。(在LGPL之下JUG也是可用的)

这是使用JUG库实现IdGenerator的例子。

  1. import org.safehaus.uuid.UUIDGenerator;  
  2. public class IdGenerator {  
  3. public static final UUIDGenerator uuidGen = UUIDGenerator.getInstance();   
  4. public static String createId() {   
  5. UUID uuid = uuidGen.generateRandomBasedUUID();   
  6. return uuid.toString();  
  7. }  

Hibernate内置的UUID生成器算法又如何呢?这是一个得到验证对象标识用的UUID的适当途径吗?如果你想让对象标识符独立于对象的持久化,这就不是一个好方法。虽然Hibernate确实提供有让它为你生成UUID的选项,但这样的话我们又回到了那个最早的问题上:对象ID的获得并不在它们被创建的时候,而在它们被保存的时候。

使用UUID作为数据库主键的***障碍是它们在数据库中(而不是在内存中)的大小,在数据库中索引和外键的复合会促使主键大小的增加。你必须在不同的情况下使用不同的表示方法。使用String表示,数据库的主键大小将会是32或36字节。Id也可以直接使用位存储,这样将减少一半的占用空间,但是如果你直接查询数据库,id将变得难以理解。这些方法对你的工程是否可行取决于你的需求。 如果你的数据库不接受UUID作为主键,你可以考虑使用数据库序列。但总是应该让新对象创建的时候被指派一个ID而不是让Hibernate管理你的ID。在这种情况下,创建新的域对象的商业对象可以调用一个使用data Access object(DAO)从数据库序列中获取数据库id的服务。如果你使用一个长整型来表示你的对象id,一个单独的数据库序列(以及服务方法)对你的域对象来说已经足够了。

小结

当对象持久化到数据库中时,对象标识符总时很难被恰当的实现。尽管如此,问题其实完全是由存在着在保存之前不持有ID的对象的现象衍生而来的。我们可以通过从诸如Hibernate这样的对象—关系映像框架手中取走指派对象ID的职责来解决这个问题。相对的,一旦对象被实例化,它就应该被指派一个ID。这使对象标识符变成简单而不易出错,也减少了领域模型中需要的代码量。

【编辑推荐】

  1. Hibernate Util简单讨论
  2. 详解优化Hibernate性能经验
  3. 概述Hibernate dbcp连接池使用方法
  4. 浅析Hibernate.cfg.xml配置
  5. Hibernate Shard基础分析

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...