2013-10-16 120 views
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或賣方,的EntityKey要麼item.id或seller.id。

現在,我有類似如下:

更新:一對多方現在是確定的,仍然需要弄清楚如何使它工作在多對一的一面。

@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; 
} 

回答

0

有兩種可能性,我能想到的:

[1]使用Hibernate的在每個@OneToMany映射@Where註解。這可以用來將註釋限制爲每個集合的適當類型。

[2]使用Hibernate的繼承特性(模式的每個類層次結構的表照原樣)。創建兩個實體SellerComment和ItemComment映射到同一個表並使用歧視列(entityType)。相關類型的@OneToOmany集合:

[2]可能會有問題需要使用@ForceDiscriminator批註。這裏的概要是:http://www.gmarwaha.com/blog/2009/08/26/hibernate-why-should-i-force-discriminator/

+0

非常感謝,我可以使用[1]解決部分問題。由於有很多實體有評論,所以不能添加類。 –

0

您可以使用一對多雙向無連接表,這意味着註釋表將有一個外鍵指向項目表。你的關係看起來像

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


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

在你的代碼中,你必須正確地設置關係的雙方。

+0

我不能這樣做。因爲評論表中沒有FK,並且它由賣家和物品共享。 –