2013-08-16 227 views
1

我有兩個可以由用戶評論的實體(可以說例如:新聞和文章)。是否可以使用一個評論實體並將它們附加到這兩個實體?JPA - 將實體映射到多個其他實體

我試着通過創建抽象超類(AbstractCommentableEntity)來處理與註釋的關係(將是CommentabeEntity1CommentabeEntity2)。然後新聞和文章實體將擴展這個類,並且可以給它們附上評論。看到我的圖片以及我的代碼。

但是,如果我這樣實現它,我會得到一個映射異常。我認爲這是因爲我試圖映射一個@MappedSuperclass註釋類。有什麼辦法可以讓我跑步嗎?

enter image description here

我的評論entiy應該是這樣的:

@Entity 
public class Comment { 

    private AbstractCommentableEntity commentableEntity; 

    @ManyToOne 
    @JoinColumn 
    public AbstractCommentableEntity getCommentableEntity() { 
     return commentableEntity; 
    } 

    public void setCommentableEntity(AbstractCommentableEntity commentableEntity) { 
     this.commentableEntity = commentableEntity; 
    } 
} 

爲commentable實體的抽象超會是什麼樣子:

@MappedSuperclass 
public abstract class AbstractCommentableEntity { 

    Set<Comment> comments = new HashSet<Comment>(); 

    @OneToMany(mappedBy = "commentableEntity") 
    public Set<Comment> getComments() { 
     return comments; 
    } 

    public void setComments(Set<Comment> comments) { 
     this.comments = comments; 
    } 
} 

和特定的實體將只是擴展它像這樣:

public class CommentabeEntity2 extends AbstractCommentableEntity{ 

} 

回答

0

您不應該使該關聯成爲雙向的:因此註釋將是一個通用實體,可以附加到任何類型的實體。 NewsArticle實體都會收集一些評論。

默認情況下,這將使用兩個連接表進行映射:一個鏈接評論和新聞,另一個鏈接評論和文章。

如果您確實希望該關聯是雙向的,那麼您可以使用具有兩個子實體的AbstractComment實體:NewsCommentArticleCommentNewsComment將具有與News的雙向ManyToOne關聯,並且ArticleComment將具有與Article的雙向ManyToOne關聯。