Hibernate和Oracle Sequence

时间:2013-10-25 06:04:04

标签: java oracle hibernate

我遇到了Oracle序列和Hibernate的问题。我使用这段代码来获取带有hibernate的Oracle Sequence

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "student_id_seq")
@SequenceGenerator(name = "student_id_seq", sequenceName = "Student_seq")
@Column(name = "StudentID")
public Long getStudentId() {
    return this.studentId;
}

public void setStudentId(Long studentId) {
    this.studentId = studentId;
}

但是当我向表中插入新值时,生成的值不正确。例如: 当我在id为2和3的数据库中有两条记录时,当我插入新记录时,它的id不是4而是25.我不知道该如何处理它。

4 个答案:

答案 0 :(得分:4)

您应该将allocationSize设置为1

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "student_id_seq")
@SequenceGenerator(name = "student_id_seq", 
                   sequenceName = "Student_seq",
                   allocationSize = 1)  

您可以在文档SequenceGenerator doc

中阅读更多内容

答案 1 :(得分:2)

当我看到你的问题时,我想知道:你真的需要拥有id而不是25,还是只是技术主键? 在缓存问题的后面,如果你从序列中询问一个值(id = 4),然后回滚你的事务,下次你会问一个数字,你会有任何差距(id = 5),在任何休眠或缓存之后相关问题。

正如Przemyslaw的第二个链接Sequence gaps - Oracle所述: “你永远不应该指望一个序列产生任何甚至接近无间隙序列的数据。它们是一种高速,极易扩展的多用户方式,可以为表生成代理键。”

据我了解,如果您的申请中没有必要具有连续价值,那么“如何处理”问题的良好答案是:没有,只是忍受这些差距。

答案 2 :(得分:0)

原因是您的序列可能在创建过程中指定了CACHE值。这已被问过几次,请查看以下两个链接:

Sequence gaps in Hibernate

Sequence gaps - Oracle

答案 3 :(得分:0)

您应该在数据库中创建如下序列:

CREATE SEQUENCE  "Student_seq"  MINVALUE 0 MAXVALUE 1000000000 INCREMENT BY 1 START WITH 1 CACHE 500 NOORDER  NOCYCLE ;

,并在您的student.hbm.xml配置中进行:

<class name="StudentPersistant" table="Student">

<id  name="id"  type="java.lang.Long" column="StudentID" >
      <generator class="sequence"> 
           <param name="sequence">Student_seq</param>   
      </generator>
</id>