web-dev-qa-db-ja.com

JPA / Hibernateアノテーションを使用して文字列のリストをマップします

私はこのようなことをしたいです:

    @Entity public class Bar {
        @Id @GeneratedValue long id;
        List<String> Foos
    }

次のようなテーブルにFoosを永続化します。

foo_bars (
    bar_id int, 
    foo varchar(64)
);

更新:

他のエンティティをマッピングする方法は知っていますが、多くの場合、やり過ぎです。私が提案していることは、さらに別のエンティティを作成したり、一部のblob列にすべてが含まれたりすることなしには不可能であるように見えます。

21
danb

これは 休止状態の用語 「値のコレクション」または「要素」にあります。 (Hibernate固有の)アノテーションがあります。 JPAはこれを(まだ)サポートしていません。

つまり、コレクションに次のように注釈を付けます。

@CollectionOfElements
@JoinTable(
        table=@Table(name="..."),
        joinColumns = @JoinColumn(name="...") // References parent
)
@Column(name="...value...", nullable=false)

これにより、外部キーと制限を備えた必要なテーブルが作成されます。

27
Maarten Winkels

JPA2を使用している場合、これを行う方法は次のとおりです。

@Entity public class Bar {
   @Id @GeneratedValue long id;

   @ElementCollection
   @CollectionTable(name="foo_bars", joinColumns=@JoinColumn(name="bar_id"))
   @Column(name="foo")
   List<String> Foos;
 }

より明確な例については、 Hibernate Annotationsリファレンスガイド のセクション2.2.5.3.3を参照してください。

28
Max Z

リストを配列として保存すると、機能します。

setFoos(String[] foos);

次のように変換できます。

setFoos(myList.toArray(new String[myList.size()]));
4
Renaud

ここで、「Foos」は文字列のリストであるため、単方向です。 @ElementCollectionアノテーションを使用して、1つのモデルクラスでこれを行うことができます。

@Entity 
@Table(name="bar")
public class Bar {

        @Id @GeneratedValue 
        long id;

        @ElementCollection
        @JoinTable(
            name="foo_bars",
            joinColumns = @JoinColumn( name="bar_id")
          )
        @Column(name="foo")
        List<String> Foos;
    }

DBでは、bar_idはfoo_barsテーブルの外部キーです。

0
kranti

エンティティ「FooBars」を作成する

属性「Foos」をリファクタリングして

@OneToManyリストFoos

0
Michael Pralow

私はそれがあなたが必要とするものだと思います:

@Entity 
public class Bar {
    @Id @GeneratedValue long id;

    @OneToMany(mappedBy="bar")   //"bar" = field name in mapping class
    List<FooBar> Foos;
}

@Entity 
public class FooBar {
    @Id @GeneratedValue long id;

    @ManyToOne
    @JoinColumn(name="bar_Id")  
    Bar bar;
}
0
Vanger