Hibernate:使用inheritace覆盖sql-delete
我有一个实体A
和B extends A
并尝试使用连接inheritance策略进行软删除。
@Entity @Inheritance(strategy = InheritanceType.JOINED) @SQLDelete("UPDATE A SET deleted = 1 WHERE id = ?") A { @Id long id; boolean deleted; } @Entity B extends A {}
似乎Hibernate正确地将表A
为deleted = 1
,但也删除了表B
的整个条目。 当然,我想保留这个条目。
有什么想法吗?
我正在使用Hibernate 3.5.5和基于注释的实体定义。 尝试过Hibernate 3.6.2。
您想要创建一个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中
此外,不要忘记在注释中更新您的级联。