2012-01-31 83 views
2

我設計了一個表(在postgres中),其中'id'列是通過它的SEQUENCE實體自動增加的。 但是,當我開始使用Hibernate我遇到的問題....由於創建插入語句,它使用如下語句java hibernate在插入時跳過插入'id'

INSERT INTO MYTABLE(ID,姓名)值(0, 'blablabla')

...

但我想它使somethink這樣的:

INSERT INTO MYTABLE(名)值( 'blablabla')

... Postgres的具有自動生成的ID(至少,當我跑這樣的腳本withing SQL編輯器,它的工作)

我相信它可以配置,但我不知道如何...

這裏是我的我的.hbm.xml的一部分:

<hibernate-mapping> 
    <class name="com.cse.database.bean.Category" table="category"> 
     <id name="id" type="int"> 
      <column name="id" /> 
      <generator class="assigned" /> 
     </id> 
     <property name="name" type="string"> 
      <column name="name" length="100" not-null="true" unique="true" /> 
     </property> 
    </class> 
</hibernate-mapping> 
+1

重要的是它的PostgreSQL。當你指定一個''時,你告訴Hibernate如何創建ID。 'assign'意味着你的應用程序正在做它(你不想要的)。 'identity'意味着數據庫爲你做了,它*是*你想要的,但是http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration- ID沒有列出PostgreSQL作爲支持。也許'序列'與PostgreSQL一起工作?你也許只能使用'本地',並且它會自動工作... – 2012-01-31 23:08:05

+0

似乎設置發電機'idenitity'解決了我的問題:)你可以發佈你的消息作爲答案,我會接受它 – davs 2012-01-31 23:34:44

+0

完成。不確定'身份'是否適用於PostgreSQL,因爲Hibernate文檔沒有列出該數據庫。 – 2012-01-31 23:38:46

回答

2

當您指定<generator>,你告訴Hibernate的如何創建ID。 assigned表示您的應用程序正在執行此操作(您不需要)。你可以指定一個Hibernate類或甚至一個應用程序類來完成它,你也不需要。 identity表示數據庫爲你做,這是你想要的。在某些數據庫中,您可以使用sequence(它將查詢序列發生器獲取ID,然後寫入記錄),Hibernate允許您使用native指定最適用於您的數據庫的數據庫。

<id name="id" type="int"> 
     <column name="id" /> 
     <generator class="identity" /> 
    </id> 

顯然在這種情況下工作。

1

assigned意味着顯式地指定的實體,這是不是這樣的ID。 PostgreSQL中的這些自動生成的ID(AFAIK)的問題是無法獲取最後生成的ID,並且在插入實體後,Hibernate無法獲取分配給實體的ID。你不應該在PostgreSQL中使用自動生成的ID。

相反,讓Hibernate使用序列發生器和插入之前分配的ID給實體:

@SequenceGenerator(name = "FOO_SEQ", sequenceName = "FOO_SEQ") 
public class Foo { 
    @Id 
    @GeneratedValue(generator = "FOO_SEQ") 
    @Column(name = "FOO_ID") 
    private Long id; 
+0

>>這些自動生成的ID在PostgreSQL,AFAIK .....我不想得到最後生成的ID .. O只是希望Hibernate不會嘗試填充'ID'列,因爲插入數據 – davs 2012-01-31 23:29:35

+0

Hibernate需要知道生成的ID。沒有ID,Hibernate不能在會話中維護實體。如果不知道實體的生成ID,Hibernate將無法使用。 – 2012-02-01 08:52:00