2011-02-10 16 views
1

私はちょっと気になる質問があります。jpa Hibernate @ ElementCollection

私のエンティティで@ElementCollectionを使うとき、hibernate(3.5)は制約なしでテーブルを生成します。

重要な編集

私のエンティティが別のクラスのサブクラスです。これはおそらく、hibernateがpkとfkを生成しない理由です。

エディットエンド

public MyEntity extends BaseEntity 
@ElementCollection(fetch=FetchType.EAGER) 
private Set<String> test; 

は(postgresの9)で終わる:

CREATE TABLE myentity_test 
(
    entityid bigint NOT NULL, 
    test character varying(255) 
) 

これは外部キーまたは一意索引のような任意の制約を設定しない休止状態私のミスはありますか? 私はそれを手動で設定することができましたが、私は完全に(可能な限り)休止状態のデータベースを作成するエンティティに正しく注釈を付けることをお勧めします。

敬具、 メートル

PS:私の悪い全然。私の心の中でどこを行き来している2つのものを混ぜた。私は@ ElementCollectionを意味しました。

PS:@Columnはユニークなインデックスの配信を助けました。編集:私の例に名前を修正しました。

CREATE TABLE myentity_test 
(
    entityid bigint NOT NULL, 
    test character varying(255), 
    CONSTRAINT itemequipable_test_test_key UNIQUE (test) 
) 

私はこのような何か(擬似コード)を期待する:

CREATE TABLE myentity_test 
(
    entityid bigint NOT NULL PRIMARY KEY, 
    test character varying(255) PRIMARY KEY, 
    CONSTRAINT fk_entityid references (myentity) on entityid 
) 
+1

あなたのサンプルコードでは@Enumeratedを使用していません –

+0

外部キーは別の 'ALTER TABLE'ステートメントによって作成されます。 – axtavt

+1

しかし、私はあなたが望むならばnullable = falseなどを設定できる@Columnアノテーションが必要だと思っています。 –

答えて

1

@Columnと@ JoinColum/@ OneToMany注釈がさえて、外部キーやユニーク制約を処理するための正しい方法です@ElementCollection。

特定の例では、String(セットの型)が別のエンティティにマップされていないため、外部キー関係はありません。

+0

良い点。はい。タイプ(xxx)が明白でないところでは、(...、targetEntity = xxx)が必要です。 Stringに相当するエンティティは想像するのが難しいですが。 –

+0

外部キーとは、コレクションテーブルから、エンティティIDに戻ってくる外部キーと、entityidとテストに対するプライマリキーが存在することを意味します。 – mkuff

+0

私は私の継承戦略をsingle_tableに戻すと、コレクションテーブルが正しく生成されることがわかりました。たぶん、hbm2ddlに問題があります。今はうまくいく。すべてのヘルパーに感謝します! – mkuff