休眠:用继承覆盖sql-delete [英] Hibernate: Overwrite sql-delete with inheritace

查看:125
本文介绍了休眠:用继承覆盖sql-delete的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个实体 A 并且 B扩展了A 并尝试使用联合继承策略进行软删除。

$ p $ @Entity
@Inheritance(strategy = InheritanceType.JOINED)
@SQLDelete(UPDATE A SET deleted = 1 WHERE id =?)
A {

@Id long id;
布尔删除;
}

@实体
B延伸A {}



看起来,Hibernate正确地将表 A 设置为已删除= 1 ,但也会将整个条目从表 B 。当然,我想保留这个条目。



对此有何看法?



我是使用Hibernate 3.5.5和基于注释的实体定义。

解决方案

您希望创建一个DeleteEventListener,如下所示:

  public class SoftDeleteEventListener extends DefaultDeleteEventListener {

private static final long serialVersionUID = 1L;
$ b $ @Override
public void onDelete(DeleteEvent event,Set arg1)throws HibernateException {
Object o = event.getObject();
if(o 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);



$ b

勾住它进入你的persistence.xml中,像这样
$ b

 < property name =hibernate.ejb.event。删除value =org.something.SoftDeleteEventListener/> 

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


I have an entity A and B extends A and try to have a soft-delete with joined inheritance strategy.

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@SQLDelete("UPDATE A SET deleted = 1 WHERE id = ?")
A {

    @Id long id;
    boolean deleted;
}

@Entity
B extends A {}

It seems that Hibernate properly sets the table A to deleted = 1, but also deletes the whole entry from table B. I would, of course, like to preserve this entry.

Any ideas on that?

I'm using Hibernate 3.5.5 and annotation-based entity definition. Tried Hibernate 3.6.2 as well.

解决方案

You'd want to create a DeleteEventListener as such:

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);
    }
}

}

hook it into your persistence.xml like this

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

Also, don't forget to update your cascades in your annotations.

这篇关于休眠:用继承覆盖sql-delete的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆