JPA - 将实体映射到多个其他实体

时间:2013-08-16 11:14:09

标签: hibernate inheritance jpa orm polymorphism

我有两个可以被用户评论的实体(比方说:新闻和文章)。是否可以使用一个评论实体并将它们附加到两个实体?

我通过创建一个抽象超类(AbstractCommentableEntity)来尝试它,它处理与评论的关系(CommentabeEntity1CommentabeEntity2)。然后,新闻和文章实体将扩展此类,并且可以将注释附加到它们。查看我的图片以及我的代码。

但是如果我这样实现它,我会得到一个Mapping异常。我想那是因为我试图映射一个@MappedSuperclass注释类。有什么方法可以让它运行吗?

enter image description here

我的评论看起来像这样:

@Entity
public class Comment {

    private AbstractCommentableEntity commentableEntity;

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

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

可评论实体的抽象超类看起来像:

@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{

}

1 个答案:

答案 0 :(得分:0)

您不应该使关联成为双向的:因此评论将是一个通用实体,可以附加到任何类型的实体。 NewsArticle实体都会有一组评论。

默认情况下,这将使用两个连接表进行映射:一个链接评论和新闻,另一个链接评论和文章。

如果您确实希望关联是双向的,那么您可以使用AbstractComment实体,其中包含两个子实体:NewsCommentArticleCommentNewsCommentNews具有双向ManyToOne关联,ArticleCommentArticle具有双向ManyToOne关联。