对于较少的连接操作,仅保留实体ID而不是Set <entity>是否是个好主意

时间:2017-01-19 15:13:56

标签: mysql database hibernate entity-relationship hibernate-onetomany

我正在尝试实现一个应用程序。在这个应用程序中,我有一个实体名称评论,答案,问题。问题,答案和评论有评论,所以我打算创建一个Commentable类,所有三个类都可以扩展Commentable。在这个可评论的类中它保持Set但我不知道这个结构的性能。因为它总是会创建一个连接查询来获取注释。如果我创建一个具有commentedObjectId的单独注释实体并且需要注释时如何在单独的表上进行查询,例如commentedObjectId = id?

    class Answer extends Commentable{}
    class Comment extends Commentable{}
    class Question extends Commentable{}

    class Commentable extends BaseModel{

    @OneToMany
    Set<Comment> comments;

    public Set<Comments> getComments() {
        return comments;
    }

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

避免连接操作的替代方法。我应该像这样对数据库进行非规范化吗?

    class Comment extends BaseModel {
    String commentedObjectId;

    public String getcommentedObjectId() {
        return commentedObjectId;
    }

    public void setcommentedObjectId(String commentedObjectId) {
        this.commentedObjectId = commentedObjectId;
    }
}

1 个答案:

答案 0 :(得分:0)

你绝对应该使用域对象。 Hibernate允许指定要加入或延迟加载的内容。

要仅加载您的Commentables而不加入评论,您可以使用此查询:

Criteria cirt = session.createCriteria(Commentable.class);
crit.setFetchMode("comments", FetchMode.LAZY);

@SuppressWarnings("unchecked")
List<Commentable> result = crit.list();