Hibernate使用UUID

介绍hibernate主键生成策略的文章网上比比皆是。但是如何选择一个适合于自己项目的主键生成策略缺没有什么好的指导性文章。在此希望与大家议论。 hibernate的主键生成策略主要包括了"uuid2","guid","uuid","uuid.hex","hilo","assigned","identity","select","sequence","seqhilo","increment","foreign","sequence-identity","enhanced-sequence","enhanced-table",全部在org.hibernate.id.factory.DefaultIdentifierGeneratorFactory中定义,至于每种生成策略的简单描述不是本文重点议论的话题,我们主要将着眼点放到各生成器的优缺点上去(当然都有优点只是适合不适合,本文就想议论这个) hibernate主键生成采用策略模式进行设计,各个生成策略都直接或或者间接实现了IdentifierGenerator接口,此接口只有一个方法publicSerializablegenerate(SessionImplementorsession,Objectobject)throwsHibernateException;这个方法由各个类实现具体的生成逻辑。

我们来一个一个看一下:

1、uuid2,IdentifierGenerator的实现类是UUIDGenerator,具体由UUIDGenerationStrategy策略负责生成,它有两个实现StandardRandomStrategy和CustomVersionOneStrategy,他们都是使用java.util.UUID的api生成主键的,StandardRandomStrategy最终由UUID.randomUUID();生成,而CustomVersionOneStrategy则采用版本号与位运算通过构造函数newUUID(mostSignificantBits,leastSignificantBits);生成。 特点是:不需要和数据库交互,可根据RFC4122定义的5中变量控制具体的生成策略(因为符合RFC4122定义,所以避免了警告信息)

2、guid,IdentifierGenerator的实现类是GUIDGenerator,通过session.getFactory().getDialect().getSelectGUIDString();获得各个数据库中的标示字符串,mySql用"selectuuid()";oracle9g用return"selectrawtohex(sys_guid())fromdual";其他看源码可知具体的生成策略。 特点是:需要和数据库进行一次查询才能生成。数据库全局唯一。

3、uuid和uuid.hex 两个是一个东西。IdentifierGenerator的实现类是UUIDHexGenerator,通过StringBuffer(36).append(format(getIP())).append(sep).append(format(getJVM())).append(sep).append(format(getHiTime())).append(sep).append(format(getLoTime())).append(sep).append(format(getCount()))生成。 特点:不需要和数据库交互,全网唯一。

4、hilo,IdentifierGenerator的实现类TableHiLoGenerator,逻辑较为复杂,通过高位运算生成(具体实现逻辑较为复杂),但是需要给定表和列作为高值的源。加上本地的位计算所得。 特点;需要和数据库交互,全数据库唯一,与guid不同的是,在标识符的单个源必须被多个插入访问时可以避免拥堵。

5、assigned IdentifierGenerator的实现类Assigned,没有生成逻辑,如果为空就抛出异常。 特点:不需要和数据库交互,自己管理主键生成,显示的指定id.

6、identity,IdentityGenerator并没有直接实现IdentifierGenerator,而是扩展了AbstractPostInsertGenerator,并实现PostInsertIdentifierGenerator,而PostInsertIdentifierGenerator实现了IdentifierGenerator. 通过IdentifierGeneratorHelper类生成,这个比较特殊,它返回是个常量"POST_INSERT_INDICATOR",指在数据库插入后时生成,然后返回数据库生成的id,还有个常量"SHORT_CIRCUIT_INDICATOR",是用外键ForeignGenerator时使用的。 特点:需要和数据库交互,数据插入后返回(反查)id,同一列唯一

7、select, SelectGenerator扩展了AbstractPostInsertGenerator实现了Configurable接口,而AbstractPostInsertGenerator实现了PostInsertIdentifierGenerator。所以具有和identity类似的行为,有数据库触发器生成。 特点:需要和数据库交互,

8、sequence,SequenceGenerator实现了PersistentIdentifierGenerator接口,和Configurable接口,PersistentIdentifierGenerator接口扩展IdentifierGenerator接口,通过数据库不同获取不同的取值语句dialect.getSequenceNextValString( sequenceName );然后进行查询,缓存到IntegralDataTypeHolder中,通过generateHolder( session ).makeValue();获得。 特点:需要和数据库交互(但不是每次都是)。sequence唯一

9、seqhilo,扩展了SequenceGenerator,处理逻辑和hilo相同,值不过是使用一个具名的数据库序列来生成高值部分。 特点:同4

10、increment,IdentifierGenerator的实现类IncrementGenerator,并实现了Configurable接口。数据库启动时查询表的最大主键列支,并通过IntegralDataTypeHolder缓存。插入一条,它自加一。 特点:仅需要首次访问数据库。

11、foreign,IdentifierGenerator的实现类ForeignGenerator,通过给定的entityName和propertyName查询获得值。 特点:需要和数据库访问。

后面的几种基本上是上面各种逻辑的组合,不再一一分析。 ##12enhanced-table是通过数据库中的表生成id的。

从上面可以看到,虽然这么多,但是大体可以分为三类 1、不需要和数据库交互就可以生成id的。包括uuid,uuid2,uuid.hex 2、需要和数据库交互以生成id的。guid,hilo,identity,select,sequence,seqhilo,increment、foreign 可细分为一个id一个sql:guid,identity,select,foreign 一个sql多个id:hilo,sequence,seqhilo,increment 3、不用交互我自己管理assigned

提高系统新能的主要做法就是显著减少数据库的访问次数。通过上面的分析,可作为我们考虑的一个指标。 大家议论下,自己项目中的主键生成是什么策略,以及优缺点是什么?

这是为csdn的大牛ldh911的议论以下继续 ◎ 关于ID生成 —— 我一贯认为入手都是Assigned,也就是说我考虑的方式是:如果我自己来生成这个ID的话,最优选择是啥?然后再看看Hibernate之类的是否能提供我最优选择所期望的。 —— 是否集群环境?是第一个要考虑的因素,但基本上我都以集群环境为必要条件; —— 然后是:超高并发生成?超高并发查询?ID是否需要存在语义?等问题。

◎ 不同的ID对我来说有啥区别? —— UUID:极其适用于分布式计算环境(超越集群了),但ID将不能承载任何语义,高并发生成支持较好,超高并发查询存在数据库端不易优化的问题。 —— 数据库端sql:适用于集群环境,ID可承载某些语义(比如生成时间上较大范围的先后顺序),超高并发生成较搓,超高并发查询可做特定分区优化。

转载于:https://my.oschina.net/u/2396694/blog/720031

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 JavaScript 编写的记忆游戏(附源代码)   项目:JavaScript 记忆游戏(附源代码) 记忆检查游戏是一个使用 HTML5、CSS 和 JavaScript 开发的简单项目。这个游戏是关于测试你的短期 记忆技能。玩这个游戏 时,一系列图像会出现在一个盒子形状的区域中 。玩家必须找到两个相同的图像并单击它们以使它们消失。 如何运行游戏? 记忆游戏项目仅包含 HTML、CSS 和 JavaScript。谈到此游戏的功能,用户必须单击两个相同的图像才能使它们消失。 点击卡片或按下键盘键,通过 2 乘 2 旋转来重建鸟儿对,并发现隐藏在下面的图像! 如果翻开的牌面相同(一对),您就赢了,并且该对牌将从游戏中消失! 否则,卡片会自动翻面朝下,您需要重新尝试! 该游戏包含大量的 javascript 以确保游戏正常运行。 如何运行该项目? 要运行此游戏,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox, 以获得更好、更优化的游戏体验。要玩游戏,首先,通过单击 memorygame-index.html 文件在浏览器中打开游戏。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值