2015-08-28 108 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 !!