首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate:使用继承覆盖sql-delete

Hibernate:使用继承覆盖sql-delete
EN

Stack Overflow用户
提问于 2011-03-23 20:05:34
回答 1查看 4.9K关注 0票数 5

我有一个实体AB extends A,并尝试使用连接继承策略进行软删除。

代码语言:javascript
复制
@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。

EN

回答 1

Stack Overflow用户

发布于 2012-05-11 18:39:14

您可能希望这样创建一个DeleteEventListener:

代码语言:javascript
复制
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中

代码语言:javascript
复制
<property name = "hibernate.ejb.event.delete" value = "org.something.SoftDeleteEventListener"/> 

另外,别忘了在你的注释中更新你的级联。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5404964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档