使用Hibernate操作oracle数据库偶现错误

摘要

又一次在使用Hibernate的save()和saveorupdateall()偶尔会出现不同的对象使用相同主键的问题,可是怎么也找不到是什么原因,表主键ID是也是自增长的。

又一次在使用Hibernate的save()和saveorupdateall()偶尔会出现不同的对象使用相同主键的问题,可是怎么也找不到是什么原因,表主键ID是也是自增长的。如下:

<id name="id" type="java.lang.Long">
    <column name="ID" precision="10" scale="0" />
     <generator class="increment" />
</id>

 

最终还是找到了原因:主要是索引的问题导致的。

创建索引的唯一、主键与创建约束时候的唯一约束和主键约束有什么区别呢?

这里的可能容易产生误解,其实创建主键的结果是一样的,不管是在创建约束时创建还是创建索引时创建,都会创建一个主键约束和对应的一个唯一索引。

创建唯一约束与创建唯一索引有所不同:

创建唯一约束会在Oracle中创建一个Constraint,同时也会创建一个该约束对应的唯一索引。

创建唯一索引只会创建一个唯一索引,不会创建Constraint。

也就是说其实唯一约束是通过创建唯一索引来实现的。对于前端开发人员来说这两者有什么区别吗?好像没有。都是不能插入重复的值。在删除时这两者也有一定的区别,删除唯一约束时可以只删除约束而不删除对应的索引,所以对于的列还是必须唯一的,而删除了唯一索引的话就可以插入不唯一的值。


因此在oracle表中,要把对应的索引类型设置为unique的,如果是normal类型的就会出错。个人建议在使用Hibernate保存数据的时候尽量使用oracle的sequence去生成主键。


<id name="id" type="java.lang.Long">
    <column name="ID" precision="10" scale="0" />
                <generator class="sequence">
    <param name="sequence">seq_s_loginfo_id
    </param></generator>
</id>


IT家园
IT家园

网友最新评论 (0)