私はかなり長い間、Hibernate 4.1.1で作業しています。 以下:私は、HibernateのIntegrator Interfaceによって統合されたEventListenerを作成しました。これまでのところ、これは動作します!EventListenerのエンティティを削除する
私は、アカウントなどのエンティティを削除しようとしています。 アカウントはプレイリストと1対1の関係にあります。
達成したいこと: アカウントを削除するとプレイリストが削除されます。
私は、私がHibernate Mappingsにカスケード動作を追加することでこれを達成できることを知っています。 これまでのところ、これは動作しますが、Hibernateがカスケードにnull値を設定するための機能を提供することができないので、私は手動でこれらのステップをやってみたかった:
@Override public boolean onPreDelete(final PreDeleteEvent preDeleteEvent) throws HibernateException
{
if (preDeleteEvent.getEntity() instanceof PresetEntry) {
} else if (preDeleteEvent.getEntity() instanceof AccountEntry) {
final Session session = this.sessionFactory.getCurrentSession();
if (!session.getTransaction().isActive()) {
session.getTransaction().begin();
}
final AccountEntry accountEntry = (AccountEntry) preDeleteEvent.getEntity();
session.createQuery("DELETE FROM PlaylistEntry WHERE ACCOUNT_ID = " + accountEntry.getIdentity()).executeUpdate(); //NON-NLS
} else if (preDeleteEvent.getEntity() instanceof PlaylistEntry) {
} else if (preDeleteEvent.getEntity() instanceof QueueEntry) {
}
return false;
}
私は問題を以下で実行している:
アカウントは現在、(それが延々と削除playlistEntryクエリをコミットしています)- は、トランザクションがすでに開いていますonPreDeleteメソッド内ではクエリが実行されますが、Swingアプリケーションは永遠にフリーズし始めます。
現在、あなたのコードは 'カスケード'で実現できますか? –
@EugeneRetunskyそれは絶対に正しいです!しかし、カスケードなしでそれを行うことで達成可能ではないのでしょうか? Hibernateのカスケード機能には、あまりにも多くのSQLカスケード機能がありません(たとえば、ON DELETE | UPDATE SET NULLなど) –