我有一个实体A和B扩展A并尝试使用连接继承策略进行软删除.@Entity@Inheritance(strategy = InheritanceType.JOINED)@SQLDelete(UPDATE A SET deleted = 1 WHERE id = ?)A {@Id long id;boolean deleted;}@Enti...
我有一个实体A和B扩展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.
解决方法:
您想要创建一个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"/>
另外,不要忘记在注释中更新您的级联.
沃梦达教程
本文标题为:java – Hibernate:用inheritace覆盖sql-delete
猜你喜欢
- Java公平锁与非公平锁的核心原理讲解 2023-07-01
- springboot配置文件读取pom文件信息方式 2022-11-05
- feign开启日志Logger.Level feignLoggerLevel()中Level爆红的解决 2023-02-05
- Java在PowerPoint中添加上标和下标的实现方法 2023-06-17
- Java数据结构之图的基础概念和数据模型详解 2023-06-30
- RocketMQ特性Broker存储事务消息实现 2023-04-17
- 解决OkHttp接收gzip压缩数据返回乱码问题 2023-01-13
- 关于SpringBoot使用@Async的总结 2023-08-07
- Java中正则表达式匹配过程实例详解 2023-06-10
- SpringBoot用JdbcTemplates操作Mysql实例代码详解 2023-06-30