Java 休眠软删除仍在删除我的记录

Java 休眠软删除仍在删除我的记录,java,hibernate,orm,hibernate-mapping,soft-delete,Java,Hibernate,Orm,Hibernate Mapping,Soft Delete,我试图使用Hibernate实现软删除,但由于某些原因,我的记录仍然被删除。有人介意看一下吗 public class SoftDeleteEventListener extends DefaultDeleteEventListener { private static final long serialVersionUID = 1L; @SuppressWarnings("rawtypes") @Override public void onDelete(DeleteEvent event

我试图使用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());
要解决此问题,请执行以下操作:

  • 您需要定义一个
    deleted

  • 并且,您需要使用

     @SQLDelete(sql="UPDATE customer SET deleted = true WHERE id = ?")
    
  • 这比使用Hibernate拦截器简单得多

    我会尝试一个更简单的版本:

    if (dbEntity instanceof Entity) 
    {
        ((Entity)dbEntity).setDeleted(true);
        ((Entity)dbEntity).setDeletedOn(new Date());
    
        event.getSession().mergedbEntity
    } else {
        super.onDelete(event, transientEntities);
    }
    

    “软删除”是什么意思?软删除是指我更新记录,将其标记为已删除,该标记在((实体)dbEntity)行中表示。setDeleted(true);((实体)dbEntity.setDeletedOn(新日期());基本上是将记录标记为已删除,而不是实际删除记录。为什么不添加一个列来标记记录是否已软删除?这就是我所做的所有将保存到数据库的对象都扩展了一个实体类,该实体类包含两个字段“已删除/已删除”,在该字段上将记录标记为已删除。我想做的是重写hibernate delete方法,这样,如果记录是Entity类型,它就应该将其标记为deletedSo,而不是删除该记录,因为所有对象都继承自一个没有指定和id字段的Entity类,由子类来实现id。您的解决方案需要我将@SQLDelete添加到所有子类中,这不是我想要做的。。。我宁愿听删除事件检查,如果对象正在扩展实体对象,如果只是更新删除的字段,那么这样的代码应该更易于维护,这也是一种方法。您可以检查实体是否实现了软可删除接口并应用逻辑。无法让它工作,尽管在我的问题中,我对代码进行了采样,您知道它有什么问题吗?但这样它不会覆盖hibernate默认删除方法