0

アイテム、セラー、コメントの 3 つのエンティティ クラスがあります。どこ、

Item 1 --- * Comment, and Seller 1 --- * Comment

追加テーブルを追加せずに JPA/Hibernate アノテーションでクラスをマップするにはどうすればよいですか?

テーブル構造は次のとおりです。

Item(id, description)
Seller(id, name)
Comment(id, entityType, entityKey, message)

ここで、entityType は ITEM または SELLER であり、entityKey は item.id または Seller.id です。

現在、次のようなものがあります。

更新: OneToMany 側は問題ありませんが、ManyToOne 側で機能させる方法を理解する必要があります。

@Entity
@Table(name = "item_tb")
public class Item {
    @Id
    @GeneratedValue
    private Long id;

    @Column(name = "description")
    private String description;

    *** @OneToMany
    *** @JoinColumn(name = "entityKey")
    *** @Where(clause = "entityType = 'ITEM'")
    private List<Comment> comments;
}

@Entity
@Table(name = "seller_tb")
public class Seller {
    @Id
    @GeneratedValue
    private Long id;

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

    *** @OneToMany
    *** @JoinColumn(name = "entityKey")
    *** @Where(clause = "entityType = 'SELLER'")
    private List<Comment> comments;
}

@Entity
@Table(name = "comment_tb")
public class Comment {
    @Id
    @GeneratedValue
    private Long id;

    @Column(name = "entityType")
    private String entityType;

    @Column(name = "entityKey")
    private Integer entityKey;

    @Column(name = "message")
    private String message;

    @ManyToOne
    ...
    private Item item;

    @ManyToOne
    ...
    private Seller seller;
}
4

2 に答える 2

0

結合テーブルなしで一対多の双方向を使用できます。つまり、コメント テーブルには項目テーブルを指す外部キーがあります。あなたの関係は次のようになります

Item
..............
@OneToMany(mappedBy="item")    
private List<Comment> comments;


Comment
...............
@ManyToOne
@JoinColumn(name="item_id")
private Item item;

コードでは、リレーションの両側を正しく設定する必要があります。

于 2013-10-16T19:21:12.943 に答える
0

私が考えることができる2つの可能性があります:

[1] 各 @OneToMany マッピングで Hibernate の @Where アノテーションを使用します。これを使用して、コメントを各コレクションの適切なタイプに制限できます。

[2] Hibernate の継承機能 (スキーマはそのままのクラス階層ごとのテーブル) を使用します。2 つのエンティティ SellerComment と ItemComment を同じテーブルにマップし、識別子列 (entityType) を使用して作成します。関連するタイプへの @OneToOmany コレクション:

@ForceDiscriminator アノテーションを使用する必要がある [2] には問題がある可能性があります。アプローチの概要は次のとおりです。http://www.gmarwaha.com/blog/2009/08/26/hibernate-why-should-i-force-discriminator/

于 2013-10-16T21:30:09.013 に答える