0

私はアプリケーションを実装しようとしています。このアプリケーションでは、私はエンティティ名のコメント、答え、質問があります。質問、回答、コメントにコメントがあるので、Commentableクラスを作成し、3つのクラスすべてをCommentableに拡張できます。このコメント可能なクラスではSetを保持していますが、この構造のパフォーマンスは不思議です。なぜなら、コメントを得るためには常に結合クエリを作成するからです。 commentedObjectId = idのような別のテーブルでコメントを作成する必要があるときに、commentedObjectIdを持つ別々のコメントエンティティを作成するとどうなりますか?より小さい結合操作のためにSet <Entity>ではなくエンティティ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; 
    } 
} 

答えて

0

あなたは間違いなくドメインオブジェクトを使用する必要があります。 Hibernateは、何を結合するか、遅延ロードするかを指定することができます。このクエリを使用することができますコメントを結ぶことなく、ちょうどあなたのCommentablesをロードするために

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

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

は、あなたの速い返事ありがとうございますが、コメントをフェッチするときには、再びクエリに参加いたします。私は何百万人もの質問と何百万人ものコメントをしています。この結合クエリの実行方法 – ilkerbfl

+0

まだそれは結合SQLを行う、焦点ポイントです。私はパフォーマンスのために非正規化を行う方がいいですか? – ilkerbfl

関連する問題