2012-02-22 30 views
1

我有一個應用程序有一個Oracle數據庫,其中每個表都有一個觸發器調用序列來獲取該行的下一個ID。如何配置我的域以便Hibernate沒有在插入中指定下一個ID並讓Oracle和觸發器處理它?Oracle讓Oracle觸發序列而不是Hibernate?

以前我有我的域設置使用序列發生器,這似乎工作。我不能在我們的生產系統上使用它,因爲DBA不會允許我將選擇特權授予Grails序列。這顯然破壞了Hibernate的生成器。

回答

5

有此休眠論壇的主題,討論了使用generatedKeys從JDBC插入檢索id一個自定義的生成:https://forum.hibernate.org/viewtopic.php?t=973262

如果自定義生成器爲你工作,你應該可以通過能夠使用它:

static mapping = { 
    id generator:"jpl.hibernate.util.TriggerAssignedIdentityGenerator" 
} 
+0

這看起來像它會做的伎倆,謝謝。 – thomj 2012-02-22 22:33:06

0

你不能,也有使用序列支持數據庫和自動編號支持數據庫時,以下情況:

  1. 序列的支持

    1. 休眠獲取序列的下一個值
    2. Hibernate將提取的值設置爲實體的ID
    3. Hibernate持久化的實體,它的ID被查詢設置
  2. 自動編號支持

    1. Hibernate持久化的實體,沒有ID值
    2. Hibernate的取指從JDBC驅動程序分配的ID

事實上Oracle的驅動程序的問題不支持步2.2,所以Hibernate無法檢索最後分配的ID(因此它可以將其設置爲實體的ID)。

+0

我會提到使用Hi-Lo密鑰生成器要好得多,因爲hibernate對數據庫的查詢要少一些。 – 2012-02-22 21:05:49