精通Hibernate——Hibernate内置标识符详解

1、increment标识符生成器
由Hibernate以递增的方式为代理主键,例如:

<hibernate-mapping>
    <class name="mypack.IncrementTester" table="INCREMENT_TESTER" >
        <id name="id" type="long" column="ID" >
            <meta attribute="scope-set">private</meta>
            <generator class="increment" />
        </id>

        <property name="name" type="string">
            <column name="NAME" length="15" />
        </property>
    </class>
</hibernate-mapping>

Hibernate在持久化一个IncrementTester对象时,会以递增的方式生成标识符,事实上,Hibernate在初始化阶段读取INCREMENT_TESTER表中最大主键值,接下来向INCREMENT_TESTER表中插入记录时,就在max(ID)基础上递增,增量为1。下面考虑有两个Hibernate应用进程访问同一个数据库的情景。
(1)假定第一个进程中的Hibernate在初始化阶段读取INCREMENT_TESTER表中最大主键为6
(2)第二个进程中的Hibernate在初始化阶段读取INCREMENT_TESTER表中最大主键仍然为6
(3)接下来两个进程中的Hibernate各自向INCREMENT_TESTER表中插入主键为7的记录,这违反了数据库完整性约束,导致有一个进程的插入操作失败。
由此看见,increment标识符生成器仅仅在单个Hibernate应用进程访问数据库的情况下才能有效工作。更确切的说,即使在同一个进程中创建了连接同一个数据库的多个SessionFactory实例,也会导致插入操作失效。在J2EE软件架构中,Hibernate通常作为JNDI资源运行在应用服务器上。
increment标识符生成器具有以下适用范围:
1、由于increment生成标识符的机制不依赖于底层数据库系统,因此他适用于所有的数据库系统
2、适用于只有单个Hibernate应用进程访问同一个数据库的场合,在集群环境下不推荐使用
3、OID必须为long,int或short类型,如果把OID定义为byte类型,在运行时会抛出以下异常:
[java] net.sf.hibernate.id.IdentifierGenerationException:this id generator generates long,integer,short,identity

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值