0

次のスニペットのように、一連のタグを含むエンティティ A があります。

@Entity
@Table(name = "tab_a")
public class A {

......

@Column(name = "name")
@ElementCollection(targetClass = Genre.class, fetch = FetchType.EAGER)
@CollectionTable(name = "tab_resource_tags", joinColumns = @JoinColumn(name = "id"))
@Enumerated(value = EnumType.STRING)
@OrderColumn
private Set<Genre> resourceTags;

------
}

これを機能させるためだけに追加の tab_resource_tags を作成しましたが、単体テストを実行してタグをクラス A に挿入すると、新しく作成されたテーブルは空のままになります。その要点がよくわかりません。

「A」エンティティが格納されているのと同じテーブルにタグを格納することを目指していました。理想的には、それらは平文で、人間が判読できるようにカンマで区切る必要があります。

私の質問は、列挙型のセット/リストを挿入するためだけに別のテーブルを作成する価値はありますか? 列挙型をデータベースにまったく反映せず、元の「A」テーブルに挿入する方がエレガントではないでしょうか?

これに関するご意見をお待ちしております。

後で編集:

回避策として指定してみました

@CollectionTable(name = "tab_a", joinColumns = @JoinColumn(name = "id"))

しかしHibernateは、tab_aの列にはデフォルト値がないと言います(これは非常に奇妙だと思います)。

4

1 に答える 1

1

これが私がこれを解決した方法です(他の誰かがこの情報を必要とする場合に備えて):

注釈はほとんど同じなので、元の質問を見ることができます(タグの@Columnは、tab_aではなくtab_resource_tagsの列を表し、@ JoinColumnは同じtab_resource_tagsに属します)。これについて詳しくは、http://en.wikibooks.org/wiki/Java_Persistence/ElementCollectionを参照してください。

問題はDBテーブルにありました:

DB内のtab_aのテーブルについて特別なことは何もありません。重要な部分はtab_resource_tagsです:

CREATE TABLE `tab_resource_tags` (
    `resource_descriptor_id` int(11) NOT NULL,
    `tag_name` varchar(255) NOT NULL
)
  • ここに主キーがないことに注意してください(これは私の間違いでした)。

そのため、Genreタイプの列挙型のセットを含むエンティティを追加するたびに、それらはタグテーブルに入り、多対多の関係を効果的にシミュレートします(列挙型のみで、実際のクラスではありません)。

これがそれを明らかにすることを願っています。

于 2013-01-06T17:57:53.533 に答える