2016-04-11 9 views
2

私はEntryエンティティとCommentエンティティを持っています。エントリーエンティティはコメントエンティティにOneToMany関連を持っている:休止状態で大きなコレクションを扱う方法

/deleteComment?entryId=5&commentId=7 

私のアプローチは、コントローラで次のようになります。

@Entity 
@Table(name="entries") 
public class Entry { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name="id") 
    private int id; 

    @OneToMany(mappedBy = "entry", cascade = CascadeType.ALL, orphanRemoval = true) 
    @LazyCollection(LazyCollectionOption.EXTRA) 
    private List<Comment> comments = new ArrayList<>(); 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public List<Comment> getComments() { 
     return comments; 
    } 

    public boolean containsComment(int commentId) { 
     return comments.contains(commentId); 
    } 

    public Comment getComment(int commentId) { 
     return comments.get(commentId); 
    } 

    public void removeComment(Comment comment) { 
     comments.remove(comment); 
    } 
} 


@Entity 
@Table(name="comments") 
public class Comment { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id") 
    public int id; 

    @ManyToOne 
    private Entry entry; 

    public int getId() { 
     return this.id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public Entry getEntry() { 
     return entry; 
    } 

    public void setEntry(Entry entry) { 
     this.entry = entry; 
    } 
} 

は、バックエンドに次のリクエストを送信している私は単一ページのアプリケーションを持っていると仮定しましょうentryIdパラメータでエントリを取得します。 私はEntry-entityに対してcontainsComment()メソッドを呼び出すよりも、commentIdリクエストパラメータを渡すメソッドが必要です。コレクションに指定されたIDを持つコメントが含まれている場合はtrueになります。 trueの場合、getComment()メソッドを呼び出してCommentエンティティを取得します。 最後に、commentエンティティをパラメータとしてremoveComment() - メソッドを呼び出します。

PHP Doctrineでは、私はこのアプローチがうまくいったと思います。これは、休止状態で正しい方法ですか?サンプルコードで

私はcontainsComment()メソッドを呼び出した場合、私は、次の例外を取得:コメントはすぐに大規模なコレクションを取得することができますので、私はEXTRA-LAZYで動作

org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [public int com.mypackage.Comment.id] by reflection for persistent property [com.mypackage.Comment#id] : 7 

注意。

答えて

3

あなたはクエリでこれを行うことができます。 CommentEntryへの参照がある場合は、select c from Comment c where c.id = :commentId and c.entry.id = :entryIdのようなものを使用してください。あなたがそのコメントを受け取ったら、それが存在し、すぐに使用できます。

コメントを削除するだけで簡単です。 Commentはリレーションの所有者であるため、削除するとリレーションシップも削除されます。

ヒント:HQL/JPQLクエリはidプロパティにキーワードidを使用します。あなたの場合、idには@Idと注釈されているので大丈夫です。しかし、別の@Idフィールドがある場合、照会でidを使用すると、@Idフィールドと見なされるため、照会は期待どおりに動作しません。最後に

comments.contains(commentId)上の追記:リストなどのJavaコレクションは、通常、あなたのコレクションがList<Comment>であり、あなたが(intある)のID、それが発見されてはならないを渡すので、あなたは、パラメータとして渡すが、要素を探します。私はHibernateのコレクションが特別な翻訳ロジックを採用しているのかどうか確信していませんが、Javaプログラマにはエラーのように見えるので、真実を返すことは決して期待できません(リンゴのリストにはこのオレンジが入っていますか? 。