概述Hibernate对象标识符

开发 后端
这里介绍Hibernate对象标识符,以及介绍Hibernate内置的UUID生成器算法又如何呢?这是一个得到验证对象标识用的UUID的适当途径吗?如果你想让对象标识符独立于对象的持久化,这就不是一个好方法。

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基础分析
责任编辑:佚名 来源: IT168
相关推荐

2012-02-08 14:01:18

HibernateJava

2009-08-26 14:01:18

C#标识符

2009-10-27 14:20:37

VB.NET动态标识符

2011-03-14 10:17:40

JavaScript

2022-07-17 06:57:02

时间戳唯一标识符

2009-12-08 19:29:10

PHP生成唯一标识符

2009-06-26 18:07:12

JSF客户端标识符

2009-07-21 12:59:25

Scala标识符

2017-04-21 12:30:45

AndroidAndroid O设备标识符

2010-01-15 18:17:39

VB.NET动态标识

2023-08-22 08:52:14

Go零值标识符

2023-05-28 00:09:21

2023-09-26 07:28:47

2009-07-09 17:02:04

JDK学习笔记数据类型

2023-03-13 10:01:27

Java注释

2009-06-29 08:48:41

Hibernate缓存

2024-04-07 00:00:02

Android设备标识符

2009-09-29 16:04:29

Hibernate S

2020-10-21 08:25:03

Java基础入门

2009-09-23 09:47:23

Hibernate e
点赞
收藏

51CTO技术栈公众号