@GeneratedValue(strategy=GenerationType.TABLE)
告訴JPA提供者在將新創建的實體插入數據庫時使用表來獲取ID。
當使用Hibernate作爲提供者時,這會產生一個表hibernate_sequences
,它有兩列:實體名稱和已經分配給該實體的最大身份。在這裏,看起來Hibernate沒有成功從您的實體獲取下一個ID,但很難說明原因,因爲您沒有提供足夠的信息。
那麼,您能否提供完整的堆棧跟蹤?此外,請將hibernate.show_sql
屬性設置爲true
,並設置正確的日誌級別log4j.logger.org.hibernate.SQL=DEBUG
。如果可能的話,加入日誌到你的問題。
也許只是檢查您是否爲Oracle配置了正確的hibernate.dialect
。實際上,如果可能的話,加入你的休眠配置。 PS:使用Oracle生成PK的「傳統」方法是使用序列(您可以讓Hibernate使用GenerationType.AUTO
或使用SEQUENCE
強制使用SEQUENCE
來推測您的數據庫類型的最佳策略),但我會假設您需要結果數據結構是數據庫不可知的。如果沒有,我會建議去替代序列。
編輯:回答評論從OP約GenerationType.AUTO
。事實上,默認值是一個叫做hibernate_sequence
的單一全局序列,這可能是一個問題。但是,如下所示的設置,您可以使用GenerationType.AUTO
,仍然控制的情況下,序列的名稱,其中數據庫採用序列:
@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="my_entity_seq_gen")
@SequenceGenerator(name="my_entity_seq_gen", sequenceName="MY_ENTITY_SEQ")
private long id;
換句話說,你可以使用使用不同的序列名稱爲每個表沒有失去可移植性。
如果我把GenerationType.Auto,它將使用全局增量數,意味着我所有的實體將增加相同的數字。代碼運行正常,但它會用完增量數字嗎? – cometta 2009-11-30 04:53:54
@Pascal:如果我們提供了一個SequenceGenerator,它是否有助於將Startegy指定爲AUTO? – Nrj 2009-11-30 05:36:51
@Nrj實際上,如果你使用'AUTO'並且數據庫使用序列,'@ SequenceGenerator'將有助於控制序列的名稱。但是,如果數據庫不存在,它將被「忽略」(例如使用HSQLDB)。所以,與'SEQUENCE'不同,這是可移植的。 – 2009-11-30 05:49:52