親オブジェクトから CascadeType.ALL を持つ子のリストへの非常に単純な単方向 @OneToMany があります。子の 1 つを正しく削除するにはどうすればよいですか?
もちろん、リストで remove(child) を呼び出してから session.saveOrUpdate(parent) を呼び出すだけでは機能せず、孤立した削除を指定しない限り、データベースで子は削除されません。
孤立した削除の代わりに、session.delete(child) で DB から削除してから、リストから remove(child) してから、session.refresh(parent) を実行する必要があるので、親オブジェクトメモリ内に正しい状態がありますか?
子を正しく削除し、孤児を削除せずにデータベースで削除するにはどうすればよいですか?
私は現在、私のParentDaoでこれについて考えています:
public void removeChild(Parent parent, Child child) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = null;
try {
session.beginTransaction();
session.delete(child);
session.getTransaction().commit();
parent.getChildren().remove(child);
session.refresh(parent);
} catch (RuntimeException e) {
if (tx != null) {
tx.rollback();
}
throw e;
} finally {
session.close();
}
}