2012-11-17 18 views
2

我在使用Oracle XE數據庫的項目中遇到了GeneratedValue批註問題。該值根本不會生成 - 嘗試在自動生成的字段中插入表中的行時,我不斷收到錯誤。使用oracle和hibernate生成的值不起作用

"Caused by: java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL into ("SYSTEM"."T_VAPP"."VAPPID")" 

完全相同的代碼與德比或MySQL,但我需要使它與Oracle合作,它似乎忽略了什麼,我把生成的字段定義。我嘗試使用GenerationType.TABLE,GenerationType.SEQUENCE,但同樣的錯誤仍然存​​在。我還使用Oracle SQL開發人員驗證過代碼中定義的序列沒有被創建。我在這裏錯過什麼?

@Entity 
@Table(name = "T_vApp") 
@RooJavaBean 
@RooToString 
@RooJpaActiveRecord(identifierColumn = "vAppId", identifierField = "id", table = "T_vApp") 
public class VLabApplication { 



    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO, generator="my_entity_seq_gen") 
    @SequenceGenerator(name="my_entity_seq_gen", sequenceName="MY_ENTITY_SEQ") 
    @Column(name = "vAppId") 
    private Long id; 

回答

1

您使用GenerationType.AUTO代替GenerationType.SEQUENCE

+0

AUTO for oracle將選擇序列生成器(這就是爲什麼它被稱爲'AUTO';))。 – ishi

+0

謝謝,我實際上嘗試了AUTO和SEQUENCE ... –

2

GenerationType.AUTO是正確的---這將確保您的代碼適用於甲骨文以及像MySQL(無需更改代碼)。我這樣使用它,從來沒有任何問題。

嘗試移除@Roo魔法,生成setter/getters並查看是否有幫助。順便說一句,我通常註釋吸氣劑。我不認爲這是問題,但如果一切都失敗了,你可以隨時嘗試。

我的猜測是roo和hibernate之間的一些問題(我從來沒有用過也沒有讀過roo,所以它確實是猜測)。

+0

Spring Roo只是使用AspectJ來簡化POJO,比如生成所有get/set方法,在AJ文件中編譯時在後臺生成toString()方法。還有其他的東西可以幫到你,但大部分Roo註釋只是通過刪除樣板文件來簡化你的java代碼。 – tgharold

2

我懷疑它可能會感到困惑,因爲你在兩個地方告訴它標識符字段是什麼。另外,你用@Table和@RooJpaActiveRecord註釋中的參數告訴它。您可能應該從類的@RooJpaActiveRecord註釋中刪除所有參數。在類「id」成員上留下@Id和@Column註釋,並在類上留下@Table註釋。

或者,您可能需要切換到自定義生成器類,以基於哪個數據庫執行正確的操作。

+0

確實 - 標識符定義太多。我按照描述刪除了它們,但仍然是相同的錯誤。將嘗試創建一個全新的項目,以測試是否與當前項目橫向一致。 –