【问题标题】:Hibernate Soft Deletion Still deleting my Record休眠软删除仍在删除我的记录
【发布时间】:2014-07-13 07:44:52
【问题描述】:

我正在尝试使用 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());

【问题讨论】:

  • 软删除是什么意思?
  • 软删除是我更新记录以标记为已删除的地方,这在 ((Entity)dbEntity).setDeleted(true); 行中表示。 ((Entity)dbEntity).setDeletedOn(new Date());
  • 基本上将记录标记为已删除,而不是物理删除记录
  • 为什么不添加一列标记记录是否被软删除?
  • 这就是我所做的所有将保存到数据库的对象扩展一个实体类,其中包含 2 个字段 deleted / deleted_on 将记录标记为已删除。我想要做的是覆盖休眠删除方法,这样如果它是实体类型,而不是删除记录,它应该将其标记为已删除

标签: java hibernate orm hibernate-mapping soft-delete


【解决方案1】:

要解决这个问题:

  1. 您需要定义一个deleted

  2. 而且,你需要用

    注释实体
     @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);
}

【讨论】:

  • 所以所有对象都继承自一个没有指定id字段的Entity类,它留给子类来实现id。您的解决方案将需要我将@SQLDelete 添加到我的所有子类中,这不是我想做的事情......我宁愿听删除事件检查对象是否正在扩展实体对象以及它是否只是更新已删除字段这样的代码应该更易于维护
  • 这也是一种方法。您可以检查实体是否实现了软删除接口并应用逻辑。
  • 虽然在我的问题中我对代码进行了采样,但无法让它工作,知道它有什么问题吗?
  • 但是这样就不会覆盖hibernate默认的删除方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 2018-06-20
相关资源
最近更新 更多