1. ホーム
  2. java

JPAで単方向のOneToManyリレーションシップを定義する方法

2023-09-25 21:52:30

質問

JPAのエンティティマッピングで次のような問題があります。私は2つのエンティティを持っています。最初のものはルックアップであり、2番目はエンティティの翻訳を表すテキストです。今、私はルックアップをテキストにバインドする必要がありますが、私はテキストがルックアップへの参照を持っている必要はありません。これをより複雑にするために、テキストはこの関係でその主キーを使用しませんが、メタコードで定義された 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に結合テーブルを作成することができませんし、TextクラスにLookupをバインドしたくありません。だから、誰か他の方法があるかどうか教えてください。

どのように解決するのですか?

私のJPAの仕事のバイブルは Java Persistence wikibookです。 . これには セクションがあり、一方向性の OneToMany で行う方法を説明しています。 @JoinColumn アノテーションを使用する方法を説明しています。あなたの場合は、以下のようにしたいのではないでしょうか。

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

を使ったのは Set ではなく List というように、データ自体に順序がないためです。

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

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