0

最近、Hibernate セッションを介してオブジェクトが削除されたときに、いくつかのアクションを実行する必要がある状況に遭遇しました。

エンティティが削除される前に一方向の関係を削除したくありませんが、次のコードではスタック オーバーフロー例外が発生します。

@Component("emsPreListener")
public class IntegrationEntityDeleteListener implements PreDeleteEventListener {

    private static final long serialVersionUID = 2245534615822054792L;

    @Override
    @SuppressWarnings("unchecked")
    public boolean onPreDelete(PreDeleteEvent event) {

        System.out.println("PRE-DELETE");

        Session session = event.getSession();

        if (event.getEntity() instanceof Project) {
            Transaction transaction = null;
            try
            {
                transaction = session.beginTransaction();

                Project project = (Project) event.getEntity();

                Criteria criteria = session.createCriteria(ProjectPoll.class);
                criteria.add(Restrictions.eq("project", project));
                List<ProjectPoll> polls = criteria.list();
                if(polls != null) {
                    for(ProjectPoll projectPoll : polls) {
                        session.delete(projectPoll);
                    }

                    return false;
                }
            }
            catch (Exception exception) {
                exception.printStackTrace();
            }
            finally
            {
                if(transaction != null) transaction.commit();
            }

        }

        return false;
    }

}

これは、関係を持つ唯一のエンティティです。

@Entity
@Table(name = "project_poll")
@PrimaryKeyJoinColumn(name = "poll_id", referencedColumnName = "id")
public class ProjectPoll extends Poll {
    private static final long serialVersionUID = -2230614967405436988L;

    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name = "project_id")
    private Project project;

    public Project getProject() {
        return project;
    }

    public void setProject(Project project) {
        this.project = project;
    }
}

TNX

4

1 に答える 1

0

cascade=CascadeType.ALL で双方向リレーション ProjectPoll.project に注釈を付けました。projectPoll を削除すると、親 (プロジェクト) も削除されます。これにより、 onPreDelete() がもう一度トリガーされます。双方向リレーションのカスケード属性を削除してみてください。

于 2013-10-28T16:46:10.173 に答える