2017-02-12 16 views
0

私はこのような2つのエンティティがあります。親からすると削除子休止状態、親から子を削除する必要があります。親の子をすべてフェッチする必要はありますか?

@Entity 
public class Parent { 
    @Id 
    @GeneratedValue 
    private Long id; 

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

    ...Getter & Setter 
} 

@Entity 
public class Child { 
    @Id 
    @GeneratedValue 
    private Long id; 

    @ManyToOne(optional = false) 
    private Parent parent; 

    ...Getter & Setter 
} 

は、この親のすべての子を照会します:

parent.getChilds().remove(child); 

私は親に100000+子リンクを持っています。すべての子を照会するのが非常に遅く、容認できません。

この質問を修正する、または他の方法を使用するにはどうすればよいですか?

+0

子どもは '子ども'です; – Antoniossss

+0

@Antoniossss私には恥ずかしがり屋です。私はあなたが私が何を意味するのかを理解してくれることを祈っています:) – Alex

+0

OFC私は:)あなたのための答えを準備しています。 – Antoniossss

答えて

0

Hibernateは適切なSQLを準備するためにすべての子をフェッチする必要があります。削除する子要素のIDを知る必要があります。 だから、あなたがそれを使用したい方法でORMを使用してそれを行うための方法はありませんが、あなたが自分自身に質問をする場合、どのように明白な解決策は次のようになり、プレーンSQLでこれを行うだろう

DELETE c FROM child c WHERE c.parent_id=parentId

休止そのようなクエリを生成することができますが、それはHPQLを介して行われます。だから、親と子の間の双方向の関係をdelcaredしている、あなたはchildを持っている場合parent性質を持っている、あなたはHPQLを使用して次の操作を行うことができます:あなたがそれらを取得せずに親のすべての子を削除ウィル

Query q=session.createQuery(`DELETE c FROM chilc WHERE c.parent=:parent`); 
q.setObject("parent",parent); 
q.execute(); // q.executeUpdate? 

この道を。

免責事項: HibernateのSession APIはもう覚えていないが、ソリューション全体の視線が与えられ、100%有効であるため、指定されたクエリは100%正確ではない可能性があります。詳細については、Hiberrnateのドキュメントを参照してください。

-1

使用更新親を使用してカスケード接続せずにセッションのdelete方法:その管理を確認するために、次のように削除する前に、マージを実行することをお勧めし

sesionFactory.getCurrentSession().delete(child); 

更新

を:

sesionFactory.getCurrentSession().merge(child); 
+0

これは感情的ではありません。とにかく子供を連れて来なければならないので、OPはそれを腹立たせようとしています:) – Antoniossss

+0

おそらく私は詳細について質問していたはずですが、その質問から '子どもがどこから来たのかはっきりしません。それはパラメータとして渡されるかもしれません(分離されたエンティティまたはまだ管理されている)このメソッドにして、それを削除するために親を使用する必要はありません –

+0

おそらく..まだ100%クリア –

関連する問題