5

私はエンティティを持っていAB extends A、結合された継承戦略でソフト削除をしようとしています。

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@SQLDelete("UPDATE A SET deleted = 1 WHERE id = ?")
A {

    @Id long id;
    boolean deleted;
}

@Entity
B extends A {}

Hibernate は table を に適切に設定しているようですが、 tableAからdeleted = 1エントリ全体も削除していますB。もちろん、このエントリは保存したいと思います。

それに関するアイデアはありますか?

私は Hibernate 3.5.5 と注釈ベースのエンティティ定義を使用しています。Hibernate 3.6.2 も試しました。

4

1 に答える 1

6

次のように DeleteEventListener を作成します。

public class SoftDeleteEventListener extends DefaultDeleteEventListener {

private static final long serialVersionUID = 1L;

@Override
public void onDelete(DeleteEvent event, Set arg1) throws HibernateException {
    Object o = event.getObject();
    if (o instanceof SoftDeletable) {
        ((SoftDeletable)o).setStatusId(1);
        EntityPersister persister = event.getSession().getEntityPersister( event.getEntityName(), o);
        EntityEntry entityEntry = event.getSession().getPersistenceContext().getEntry(o);
        cascadeBeforeDelete(event.getSession(), persister, o, entityEntry, arg1);

        cascadeAfterDelete(event.getSession(), persister, o, arg1);

    } else {
        super.onDelete(event, arg1);
    }
}

}

このようにpersistence.xmlにフックします

<property name = "hibernate.ejb.event.delete" value = "org.something.SoftDeleteEventListener"/> 

また、注釈でカスケードを更新することを忘れないでください。

于 2012-05-11T10:39:13.823 に答える