我遇到了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.我不知道该如何处理它。
答案 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)
答案 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>