3

Hibernate を使用してソフト削除を実装しようとしていますが、何らかの理由でレコードが削除されます。どなたでもご覧いただけます。

public class SoftDeleteEventListener extends DefaultDeleteEventListener {

private static final long serialVersionUID = 1L;

@SuppressWarnings("rawtypes")
@Override
public void onDelete(DeleteEvent event, Set transientEntities) throws HibernateException {
    Object dbEntity = event.getObject();

    if (dbEntity instanceof Entity) 
    {
        ((Entity)dbEntity).setDeleted(true);
        ((Entity)dbEntity).setDeletedOn(new Date());

        EntityPersister persister = event.getSession().getEntityPersister( event.getEntityName(), dbEntity);
        EntityEntry entityEntry = event.getSession().getPersistenceContext().getEntry(dbEntity);

        cascadeBeforeDelete(event.getSession(), persister, dbEntity, entityEntry, transientEntities);
        cascadeAfterDelete(event.getSession(), persister, dbEntity, transientEntities);
    } else {
        super.onDelete(event, transientEntities);
    }
}

}

これが私のセッション/リスナーを登録する方法です

Configuration configuration = new Configuration();
        configuration.configure();
        StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
        sessionFactory = configuration.buildSessionFactory(ssrb.build());

        EventListenerRegistry registry = ((SessionFactoryImpl)sessionFactory).getServiceRegistry().getService(
        EventListenerRegistry.class);
        registry.getEventListenerGroup(EventType.DELETE).appendListener(new SoftDeleteEventListener());
4

1 に答える 1

1

この問題を修正するには:

  1. deleted列を定義する必要があります

  2. そして、エンティティに注釈を付ける必要があります

     @SQLDelete(sql="UPDATE customer SET deleted = true WHERE id = ?")
    

これは、Hibernate Interceptor を使用するよりもはるかに簡単です。

私はより単純なバージョンを試してみます:

if (dbEntity instanceof Entity) 
{
    ((Entity)dbEntity).setDeleted(true);
    ((Entity)dbEntity).setDeletedOn(new Date());

    event.getSession().mergedbEntity
} else {
    super.onDelete(event, transientEntities);
}
于 2014-07-14T08:41:58.483 に答える