2010-08-08 18 views
17

我的PostgreSQL表的id爲bigserial,這意味着它們是在插入行時生成的(因此,在INSERT語句中沒有提供id列的值)。我無法在我的XML映射文件中爲<generator class="...">屬性找到適當的值。適合postgres serial/bigserial列的Hibernate ID生成器?

下面的代碼是我發現的最接近Postgres的最接近的代碼,但它在插入(並在插入時明確包含id字段的值)之前仍然對該序列執行SELECT nextval(...)。我只是希望Hibernate根本不包含id字段值,這樣Postgres就可以完成自己生成值的工作。

<id name="id" column="id" type="java.lang.Long"> 
     <generator class="sequence"> 
      <param name="sequence">my_sequence_name</param> 
     </generator> 
    </id> 

回答

19

這是無證但實際上你可以使用一個identity發生器的PostgreSQL在PK的時候是SERIAL型或BIGSERIAL的:

<id name="id" column="user_id" type="java.lang.Long"> 
    <generator class="identity"/> 
</id> 

關於此背景,請參見 HB-875 HHH-1675

+0

對於新版本(JPA):http://stackoverflow.com/questions/4979746/mapping-postgresql-serial-type-with-hibernate-annotations – 2012-07-31 19:04:24

1

嘗試以下和它的工作:

<id name="id" column="id" type="long" unsaved-value="null" > 
     <generator class="sequence"> 
      <param name="sequence">my_sequence_name</param> 
     </generator> 
</id> 
4

從我讀:

<id name="id" column="id" type="java.lang.Long"> 
    <generator class="sequence"> 
     <param name="sequence">my_sequence_name</param> 
    </generator> 
</id> 

應該工作的速度比:

<id name="id" column="id" type="java.lang.Long"> 
    <generator class="identity" /> 
</id> 

序列發生器落在這樣描述的非嵌入式POID發電機

非插入POID生成器是新應用的最佳選擇。 這些生成器允許NHibernate爲持久對象分配一個標識,而無需將對象的數據寫入數據庫,允許NHibernate延遲寫入,直到完成業務事務爲止,減少往返數據庫的次數。

雖然身份發生器是後插入POID發電機組:

後插入POID發電機需要的數據被持久化到數據庫 爲要生成的ID。 這會以非常微妙的方式改變NHibernate的行爲,並禁用一些性能特徵。因此,強烈建議不要使用這些POID生成器!他們 只能與其他應用程序 依賴此行爲的現有數據庫一起使用。

引用來自NHibernate 3.0 Cookbook。

+0

它看起來像你比較你的兩個代碼塊是相同,我錯過了什麼? – 2011-08-12 15:30:26

+1

@Matt哈金斯:我貼錯了:D現在改變了 – 2011-08-12 21:08:28

相關問題