为什么我hibernate native注解(注解)只有native主键生成策略有效,我想用uuid就是不行

君,已阅读到文档的结尾了呢~~
JPA实体注解与Hibernate主键..
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
JPA实体注解与Hibernate主键生成策略(13种)
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口--旗下,中国最好的系统开发学习平台!
热门推荐:
当前位置: >
Hibernate映射(一)——基本映射 Hibernate的几种映射方式 基本映射 主键生成策略 总结
发布时间: 16:41 | 作者:采集侠 | 来源:网络整理 | 浏览:
Hibernate映射(一)——基本映射
对象关系映射(ORM)的基本认识在之前的两篇博客中已有体现了。
ORM基础认识
浅谈ORM的映射方案
今天来学习的是Hibernate的对象关系映射。
Hibernate的几种映射方式
  Hibernate中映射的配置在XML中,我们要对object和table进行映射转换,只需要配置XML即可,所以学会使用Hibernate,重点也就在配置文件中的配置。
  首先我们从基本映射开始,如下例:
  1、User实体类:
import java.util.D
public class User {
public String getId() {
// public void setId(String id) {
public String getName() {
public void setName(String name) {
this.name =
  2、映射文件User.hbm.xml
  3、在Hibernate.cfg.xml中添加映射文件User.hbm.xml
com.mysql.jdbc.Driverjdbc:mysql://localhost:3306/hibernaterootssh
org.hibernate.dialect.MySQLDialect
  以上就是最基本的映射实现,很简单,其中比较重要的一点是主键生成。
  为什么要用主键生成?
    每个实体对象都是唯一的,需要去标识,表通过主键标识,实体通过在配置文件中使用标识,而主键必须提供。
主键生成策略
  从上面代码中看到,这里使用的是uuid生成策略,uuid只是主键生成策略中的一种。
  hibernate主键生成采用策略模式进行设计,各个生成策略都直接或或者间接实现了IdentifierGenerator接口,此接口只有一个方法publicSerializablegenerate(SessionImplementorsession,Objectobject)throwsHibernateE这个方法由各个类实现具体的生成逻辑。
  Hibernate的主键生成策略有很多中,但大致可以分为三类:
  1、不需要和数据库交互就可以生成id的:uuid,uuid2,uuid.hex
  说明:不需要和数据库交互,指的是在实体对象在瞬时状态即生成了主键值。
  好处:不需要和数据库交互,速度较快
  2、需要和数据库交互以生成id的:guid、identity、sequence、native、foreign
  说明:需要和数据库交互生成,需要经过一次查询才能生成
  identity:MySQL,SQL server的生成方式,自增序列
  sequence:Oracle的生成方式,自增序列
  native:identity+sequence,屏蔽了数据库的差异
  foreign:只适用基于共享主键的一对一关联映射的时候使用。即一个对象的主键是参照的另一张表的主键生成的。
  3、不用交互,自己管理:assigned
  说明:主键我们手动设置(因为需求)。
  策略的选择
  主键要唯一,主键最好适用分布式,主键最好不要自己维护,最后保证效率,所以说就推荐uuid,其特点也就是生成主键唯一,且对数据库无依赖,可移植性强。当前真是需求需要了其他的生成策略那就根据需求而定了,比如流水号的生成,有一定的生成方式,而且唯一,那流水号就可以作为主键,使用assigned策略了。
Hibernate的映射是HIbernate的重点,基本映射只是映射的开始,是最基本的,接下来总结关系映射,关系映射即有了实体和实体之间的关系,根据需求理清了关系,映射也就出来了,会用很简单。
:///Javabc/901314.htmlTechArticleHibernate映射(一)——基本映射 对象关系映射(ORM)的基本认识在之前的两篇博客中已有体现了。 ORM基础认识 浅谈ORM的映射方案 今天来学...hibernate uuid id生成策略问题
[问题点数:100分,结帖人meiweirenjian]
hibernate uuid id生成策略问题
[问题点数:100分,结帖人meiweirenjian]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。扩张hibernate的主键生成策略_imooo软件程序bug解决方案
扩张hibernate的主键生成策略
扩展hibernate的主键生成策略
Hibernate的主键生成策略有好几种:1) assigned2) hilo3) seqhilo4) increment5) identity6) sequence7) native8) uuid.hex9) uuid.string10) foreign一般而言,利用uuid.hex方式生成主键将提供最好的性能和数据库平台适应性。另外由于常用的数据库,如Oracle、DB2、SQLServer、MySql 等,都提供了易用的主键生成机制(Auto-Increase 字段或者Sequence)。我们可以在数据库提供的主键生成机制上,采用generator-class=native的主键生成方式。不过值得注意的是,一些数据库提供的主键生成机制在效率上未必最佳,大量并发insert数据时可能会引起表之间的互锁。数据库提供的主键生成机制,往往是通过在一个内部表中保存当前主键状态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),之后每次插入数据会读取这个最大值,然后加上递增量作为新记录的主键,之后再把这个新的最大值更新回内部表中,这样,一次Insert操作可能导致数据库内部多次表读写操作,同时伴随的还有数据的加锁解锁操作,这对性能产生了较大影响。因此,对于并发Insert要求较高的系统,推荐采用uuid.hex 作为主键生成机制。另外我们可以扩展Hibernate的类来做自己的主键生成策略:java 代码 package com.gsta.eshore.framework.util.
import java.io.S
import org.hibernate.engine.SessionI
import org.hibernate.id.AbstractUUIDG
import org.hibernate.id.C
import org.hibernate.id.IdentifierG
import java.util.P
import org.hibernate.H
import org.hibernate.dialect.D
import org.hibernate.type.T
import org.hibernate.util.PropertiesH
public class UIDGenerator extends AbstractUUIDGenerator implements Configurable {
private static long lastTime = System.currentTimeMillis();
private static short lastCount = -32768;
private static Object mutex = new Object();
private static long ONE_SECOND = 1000L;
private String sep = "";
public Serializable generate(SessionImplementor session, Object obj) {
long l = 0L;
short word0 = 0;
int i = 0;
synchronized(mutex)
if(lastCount == 32767)
for(boolean flag = false; !)
l = System.currentTimeMillis();
if(l & lastTime + ONE_SECOND)
Thread.currentThread();
Thread.sleep(ONE_SECOND);
catch(InterruptedException interruptedexception) { }
lastTime =
lastCount = -32768;
flag = true;
word0 = lastCount++;
i = getHostUniqueNum();
String s = Integer.toString(i, 16) + sep + Long.toString(l, 16) + sep + Integer.toString(word0, 16);
if(s.length() & 24)
s = s.substring(s.length() - 24);
public Serializable generate_old(SessionImplementor session, Object obj) {
String name = obj.getClass().getName();
return new StringBuffer(64)
.append(name.substring(name.lastIndexOf('.')+1)).append(sep)
.append((short)getIP()).append(sep)
.append(Math.abs((short)getJVM())).append(sep)
.append(getCount())
.toString();
private static int getHostUniqueNum()
return (new Object()).hashCode();
public void configure(Type type, Properties params, Dialect d) {
sep = PropertiesHelper.getString("separator", params, "");
public static void main( String[] args ) throws Exception {
Properties props = new Properties();
props.setProperty("separator", "");
IdentifierGenerator gen = new UIDGenerator();
( (Configurable) gen ).configure(Hibernate.STRING, props, null);
IdentifierGenerator gen2 = new UIDGenerator();
( (Configurable) gen2 ).configure(Hibernate.STRING, props, null);
for ( int i=0; i&10; i++) {
String id = (String) gen.generate(null, gen);
System.out.println(id);
String id2 = (String) gen2.generate(null, gen2);
System.out.println(id2);
这个类必须要扩展AbstractUUIDGenerator并实现Configurable接口,在generate方法中生成我们想要的主键。在hibernate的配置文件中要做以下的配置:xml 代码
name="id" type="java.lang.String"
name="id" length="24"
class="com.gsta.eshore.framework.util.uid.UIDGenerator" name="separator"-
Generator的类要引用UIDGenerator,并且可以带参数生成主键,示例是根据时间,Ip等生成一个24位的字符串。这样做的灵活性大大提高了,提供了最好的性能和数据库平台适应性。但是有时候我们在保存一条记录的时候是不能指定主键的,因为它的主键要来源于其他的表的主键,(hibernate推荐用代理主键,但是有时候设计的时候没有用到)。这个时候的主键生成策略就要是assigned了。为了保持主键的连贯性,我总不能又用另外一种主键生成策略吧。仿照上面的类,我们做一个生成24为随机字符串的类。java 代码 package com.gsta.eshore.framework.util.
public class UID
private static long lastTime = System.currentTimeMillis();
private static short lastCount = -32768;
private static Object mutex = new Object();
private static long ONE_SECOND = 1000L;
public UID()
public static String getUID()
long l = 0L;
short word0 = 0;
int i = 0;
synchronized(mutex)
if(lastCount == 32767)
for(boolean flag = false; !)
l = System.currentTimeMillis();
if(l & lastTime + ONE_SECOND)
Thread.currentThread();
Thread.sleep(ONE_SECOND);
catch(InterruptedException interruptedexception) { }
lastTime =
lastCount = -32768;
flag = true;
word0 = lastCount++;
i = getHostUniqueNum();
String s = Integer.toString(i, 16) + "`" + Long.toString(l, 16) + "`" + Integer.toString(word0, 16);
if(s.length() & 24)
s = s.substring(s.length() - 24);
private static int getHostUniqueNum()
return (new Object()).hashCode();
public static void main(String[] args) {
for (int i = 0; i & 100; i++) {
String uid=getUID();
System.out.println(uid);
在save一个实体的时候调用entity.setId(UID.getUID())。呵呵,以后用hibernate就不用烦用什么主键生成策略了,自己做一个。&id name="id" type="java.lang.String"&&column name="id" length="24"&&id type="java.lang.String" name="id"&&column length="24" name="id"&&/id&&/column&&/id&
- 李白河 - 坠落星辉 - 给我一枪 - 飘血天王 - 伏建全 - 易嫚 - 秦始皇没有睡觉 - 曹昇 - 锈色铅笔刀 - 曹昇 - 大侠别打脸 - 小桥老树 - 浮生饮一醉 - 烟雨秦楼 - 参见王爷Hibernae基于注解方式的主键生成策略_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Hibernae基于注解方式的主键生成策略
上传于||文档简介
&&本​文​介​绍​在​H​i​b​e​r​n​a​t​e​下​,​基​于​注​解​配​置​方​式​的​主​键​生​成​策​略
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩1页未读,继续阅读
你可能喜欢}

我要回帖

更多关于 hibernate主键注解 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信