【发布时间】: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