0

有 3 个实体类 - Item、Seller、Comment。在哪里,

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

我能想到的有两种可能:

[1] 在每个 @OneToMany 映射上使用 Hibernate 的 @Where 注释。这可用于将注释限制为每个集合的适当类型。

[2] 使用 Hibernate 的继承特性(每个类层次结构的表原样)。创建两个实体 SellerComment 和 ItemComment 映射到同一个表并使用鉴别器列 (entityType)。相关类型的@OneToOmany 集合:

[2] 可能存在需要使用 @ForceDiscriminator 注释的问题。该方法在这里概述:http ://www.gmarwaha.com/blog/2009/08/26/hibernate-why-should-i-force-discriminator/

于 2013-10-16T21:30:09.013 回答
0

您可以在没有连接表的情况下使用一对多双向,这意味着 Comment 表将有一个指向 item 表的外键。你的关系看起来像

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


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

在您的代码中,您必须正确设置关系的双方。

于 2013-10-16T19:21:12.943 回答