1

我对 Oracle 序列和 Hibernate 有疑问。我使用此代码通过休眠获取 Oracle 序列

@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

4 回答 4

6

你应该设置allocationSize1

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

您可以在文档SequenceGenerator doc中阅读更多信息

于 2013-10-25T06:10:53.253 回答
3

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

正如 Przemyslaw 的第二个链接,序列间隙 - Oracle中所述:“您永远不应该指望序列生成任何接近无间隙数字序列的东西。它们是一种高速、极可扩展的多用户方式,可以为桌子。”

据我了解,如果您的应用程序不需要具有连续的价值,那么“如何处理”问题的好答案是:没什么,只是忍受这些差距。

于 2015-02-24T09:40:19.583 回答
0

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

Hibernate 中的序列空缺

序列间隔 - Oracle

于 2013-10-25T06:10:17.830 回答
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>
于 2019-01-22T09:31:16.160 回答