2015-08-28 107 views
0

我设法让hibernate通过将每个表的id加入每个实体类来增加每个表的id。休眠ID增量oracle

@Entity 
public class TestObject implements Serializable{ 

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="idgen") 
@SequenceGenerator(
     name="idgen", 
     sequenceName="testobject_seq", 
     allocationSize=1, 
     initialValue=1 
    ) 

我有两个表,我通过Oracle SQL Developer手动填充数据。在我创建表格之后。

<property name="hibernate.hbm2ddl.auto">create</property> 

对于其中的数据的两个表我将initialValue设置为我所需要的。 例如,table testchamber有22行数据。所以,我的注解更改为:

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="idgen") 
@SequenceGenerator(
     name="idgen", 
     sequenceName="testchamber_seq", 
     allocationSize=1, 
     initialValue=23 
    ) 

但是当我尝试保存一个新testChamber实体我得到这个错误。

org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session 

我改变了注释之前我可以保存我的实体没有问题,但是用旧的注解hibernate随机地增加了id。例如,休眠了一个新的实体ID 60,61,而不是23,24等..

这是我的老注释:

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE) 
  • 是否有一个正确的方式,告诉休眠一个表已经有 数据,它应该开始计算形成一个特定的数字?
  • 或如何摆脱“NonUniqueObjectException”。
+0

你有没有尝试过使用flush()方法从会话对象保存之前? – Lucky

+0

我试过了,flush()has没有效果。我还认为hibernate使用flush()aut在调用transaction.commit()的时候。 –

+0

好的,试试'session.merge(object)'来保存你的数据。 – Lucky

回答

1

这篇文章帮助我与我的问题“link"。 但从@nolexa的雁是正确的,而不是从实际检查是正确的亚历克斯Gitelman。 我把这个

<property name="hibernate.id.new_generator_mappings">true</property> 

到我hibernate.cfg.xml文件和我创建的所有序列现在工作正常。非常感谢你@ nolexa !!