【问题标题】:Hibernate and Oracle SequenceHibernate 和 Oracle 序列
【发布时间】:2013-11-04 02:55:25
【问题描述】:

我对 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。我不知道该怎么处理它。

【问题讨论】:

  • 使用 'strategy = GenerationType.AUTO' 而不是 'strategy = GenerationType.SEQUENCE'。
  • 为什么要这样做? (顺便说一句,我已经尝试过了,但没有运气)

标签: java oracle hibernate


【解决方案1】:

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

Sequence gaps in Hibernate

Sequence gaps - Oracle

【讨论】:

    【解决方案2】:

    您应该将allocationSize 设置为1

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

    您可以在文档SequenceGenerator doc中阅读更多内容

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 是的:有一些方法可以保证 Oracle 级别的连续 ID(带有序列)。它只有的限制是:“它根本无法扩展”。一个事务必须等待另一个事务完成。
      【解决方案4】:

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

      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>
      

      【讨论】:

        猜你喜欢
        • 2012-07-26
        • 2014-06-24
        • 2012-11-05
        • 1970-01-01
        • 2017-05-05
        • 1970-01-01
        • 1970-01-01
        • 2017-07-14
        • 2011-07-17
        相关资源
        最近更新 更多