2012-01-31 3 views
2

私は 'id'カラムがSEQUENCEエンティティによって自動インクリメントされるテーブルを(postgresで)設計しました。 しかし、私はmytableはINTO私が問題に会っ休止状態.... INSERT文を作成による、それは次のステートメントを使用java hibernate skip insertに 'id'を挿入する

INSERT(ID、名前)の使用を開始したVALUE(0、 'blablabla')

...

が、私はそれがそのようなsomethink作りたい:

mytableはINTO INSERT(名前は)VALUE( 'blablabla')

は... Postgresは、私はそれを構成することができます信じて

(少なくとも私はそのようなスクリプトは、SQLエディタをwithing実行したときに、それが働いていた)、自動的にIDを生成する必要がありますが、私はどのように知りません...ここで

は私.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の作成方法が伝えられます。 'assigned 'は、あなたのアプリケーションがそれをやっていることを意味します(これはあなたが望むものではありません)。 'identity'はデータベースがあなたのために行うことを意味しますが、*あなたが望むものですが、http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration- idはそれをサポートするものとしてPostgreSQLをリストしていません。多分 'sequence'はPostgreSQLで動作しますか?あなたは単に 'ネイティブ'も使うことができるかもしれませんし、自動的に動作します... –

+0

私の問題を解決した 'idenitity'に設定ジェネレータが見えます:)あなたはあなたのメッセージを回答として掲示して受け入れることができます – davs

+0

完了。 HibernateのドキュメントがそのDBをリストしなかったので、 'identity'がPostgreSQLで動作するかどうかは確かではありませんでした。 –

答えて

2

あなたが<generator>を指定した場合、あなたはIDを作成する方法にHibernateを言っています。 assignedはあなたのアプリケーションがそれをやっていることを意味します(あなたはそれを望ましくありません)。 Hibernateクラスを指定することも、アプリケーションクラスを指定することもできます。どちらのクラスも必要ではありません。 identityはデータベースがあなたのためにやっていることを意味します。いくつかのデータベースでは、sequence(IDを取得するためにシーケンスジェネレータに問い合わせます。、次にというレコードを書き込むことができます)、Hibernateではnativeを使用してDBに最も適したものを指定できます。

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

このケースでは明らかです。

1

assignedは、あなたが明示的にそうではありませんエンティティのIDを割り当てることを意味します。 postgreSQLのAFAIKにおけるこれらの自動生成IDの問題は、最後に生成されたIDを取得することができず、HibernateがそのIDを挿入した後にエンティティに割り当てられた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

>> postgreSQL、AFAIKでこれらの自動生成されたIDを使って.....最後に生成されたIDを取得したくありません。Oデータだけを挿入するためにHibernateが 'id'カラムを埋めようとしません。 – davs

+0

Hibernate生成されたIDを知る必要があります。IDなしでは、Hibernateはセッション内のエンティティを維持することができません。 Hibernateはエンティティの生成されたIDを知らない場合は使用できません。 –