2013-10-25 118 views
1

我与甲骨文序列和Hibernate的一个问题。我用这个代码来获得甲骨文序列与HibernateHibernate和甲骨文序列

@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。我不知道如何处理它。

+0

使用 '战略= GenerationType.AUTO' 而不是 '战略= GenerationType.SEQUENCE'。 – Rajesh

+0

为什么要那样做? (顺便说一句,我已经尝试过,但没有运气) – ismail

回答

4

您应该设置allocationSize1

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

你可以阅读更多的文档SequenceGenerator doc

2

当我看到你的问题,我想知道:你真的需要拥有id 4而不是25,还是仅仅是技术主键? 缓存问题的背后,如果你从你的序列问的值(ID = 4),然后回滚您的交易,下一次你会问一些你将有一个缺口(ID = 5),任何休眠或背后与缓存相关的问题。

正如普热的第二个链接指出,Sequence gaps - Oracle: “你永远不应该产生任何东西,甚至接近数字的无间隙序列的顺序计数他们是一个高速,高度可扩展的多用户的方式来产生代理键。一张桌子。“

如果,据我所知,没有必要在你的应用程序连续值时,很好地回答了“什么用它做”的问题是:什么都没有,只是这些差距生活。

+0

是的:有办法如何保证Oracle级别上的连续ID(带序列)。它*仅*限制是:“它根本不会扩展”。一笔交易必须等待另一笔交易完成。 – ibre5041