Hibernate用Sequence 作主键的问题

今天隔壁部门的兄弟尝试用Oracle的Sequence为Hibernate做主键。

做法很简单,我看了之后觉得不是很妥当,应该慎用和少用,

一旦用了Sequence,那么程序就和数据库强耦合了。

从设计的角度,这是很不值得推荐的。

况且,Hibernate的优秀的主键策略那么多,怎么也轮不到Sequence吧?

 

------------------------------------------

引用这兄弟的一篇文章,指出还有tablespace的错误:

 

Hibernate在自增量上的设计缺陷
    前两天在做莱芜供电公司EIP项目集成的时候,一个平时运行很正常,但却突然出现了问题(好比我们用System.out.println(1+1);会输出2,但有一天发现它居然输出3),在做dao.save(obj)操作时,平时能得到PO的ID号,这时候居然出错了,也就是Subclass的级联PO的ID老是出错,我从hbm.xml文件查起,至到oracle的trigger到sequence找了半天,最后发现了Hibernate有一个BUG(可能也不叫BUG,而是使用场合的局限性吧)。
 
   hibernate在跨tablespaces操作时,在维护增量是会出现其在设计上的缺陷,也就是当你的PO是跨tablespace设计的时候,在做dao.save(obj)等类似操作时,由于不同的tablespace上的sequence的增量不同,所以会引起subclass的ID号与数据库记录的ID号是不一致的,也就是session中的对象的ID号是错误的,这是因为hibernate在作save操作后,在session中对象的ID号是直接从hibernate中本次自增量直接获取然后执行setId(),而不是从DB再做一次select语句行到的。(hibernate的主健自增量有不同的设置,如native,assigned等,详写Hibernate手册)
 
一般在项目中很少用到不同的tablespace,所以这个问题比较隐蔽。
 
像说流水账一样,不知道有没有把问题给说清楚-_-!!

 

但从技术的角度,做一个backup,Sequence的实现方式,核心代码是这三行:

        <generator class="sequence">
             <param name="sequence">pk</param>//pk为sequence名称
            </generator>

全部方式如下:

 

 

在Oracle中建立sequence,名称为pk:
create sequence pk
    start with 1
    increment by 1
    maxvalue 2000
    nocycle
    cache 30;
在映射文件中修改:

<class name="com.kay.pojo.Student" table="STUDENT" schema="KAY">
        <id name="id" type="java.lang.Long">
            <column name="ID" precision="22" scale="0" />
            <generator class="sequence">
             <param name="sequence">pk</param>//pk为sequence名称
            </generator>
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" length="50" />
        </property>
    </class>

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值