【问题标题】:Hibernate: Overwrite sql-delete with inheritaceHibernate:用继承覆盖 sql-delete
【发布时间】:2011-07-21 06:28:44
【问题描述】:

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

@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。

【问题讨论】:

    标签: java hibernate soft-delete


    【解决方案1】:

    您希望像这样创建一个 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 中

    <property name = "hibernate.ejb.event.delete" value = "org.something.SoftDeleteEventListener"/> 
    

    另外,不要忘记更新注释中的级联。

    【讨论】:

    • 这读起来不错,但它不适用于使用 Hibernate 5.1 的我。我正在尝试同样的事情。对我来说,该行最终还是被删除了。
    猜你喜欢
    • 2013-12-10
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    相关资源
    最近更新 更多