web-dev-qa-db-ja.com

JPAで単方向のOneToMany関係を定義する方法

JPAのエンティティマッピングに次の問題があります。 2つのエンティティがあります。1つ目はルックアップで、2つ目はエンティティの翻訳を表すテキストです。ここで、LookupをTextにバインドする必要がありますが、TextにLookupへの参照を持たせたくありません。これをより複雑にするために、Textはこの関係で主キーを使用せず、TXTHEAD_CODE列で定義されたメタコードを使用します。

Lookup.Java

@Entity
@Table(name = "DATREG")
public class Lookup implements PersistableEntity {

    @Id
    @Column(name = "DATREG_META_CODE")
    private String metaCode;

    @OneToMany
    @JoinTable(name="TXT", 
            joinColumns=@JoinColumn(name="DATREG_META_CODE", referencedColumnName="TXTHEAD_CODE"),
            inverseJoinColumns=@JoinColumn(name="DATREG_META_CODE"))
    private List<Text> text;

Text.Java

@Entity
@Table(name = "TXT")
public class Text {

    @Id
    @Column(name = "TXT_ID")
    private Long id;

    @Column(name = "TXTHEAD_CODE")
    private String code;

だから私はこれを試してみました(そして他のいくつかのバリエーション)が結果はありませんでした。 DBに結合テーブルを作成することもできません。また、LookupをTextクラスにバインドしたくありません。他の方法がある場合、誰でも教えてください。

62
Petr Mensik

JPAの仕事のための私の聖書は Java Persistence wikibook です。 単方向OneToManyのセクション があり、@JoinColumnアノテーションでこれを行う方法を説明しています。あなたの場合、私はあなたが望むだろうと思う:

@OneToMany
@JoinColumn(name="TXTHEAD_CODE")
private Set<Text> text;

データ自体が順序付けされていないため、SetではなくListを使用しました。

上記では、Wikibookの例とは異なり、デフォルトのreferencedColumnNameを使用しています。それでもうまくいかない場合は、明示的に試してください:

@OneToMany
@JoinColumn(name="TXTHEAD_CODE", referencedColumnName="DATREG_META_CODE")
private Set<Text> text;
124
Tom Anderson