JPA CascadeType.ALL不会删除孤儿
我在使用JPA删除孤立节点时遇到了以下映射问题
@OneToMany (cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "owner") private List<Bikes> bikes;
数据库中存在孤立angular色的问题。
我可以使用注释org.hibernate.annotations.Cascade
Hibernate特定的标签,但显然我不想将我的解决scheme绑定到Hibernate实现。
编辑 :看来JPA 2.0将包括对此的支持。
如果您在Hibernate中使用它,则必须明确定义注释CascadeType.DELETE_ORPHAN
,该注释可以与JPA CascadeType.ALL
结合使用。
如果您不打算使用Hibernate,则必须首先删除子元素,然后删除主logging以避免任何孤立logging。
执行顺序
- 取主行被删除
- 获取子元素
- 删除所有的子元素
- 删除主要行
- closures会议
使用JPA 2.0,现在可以使用选项orphanRemoval = true
@OneToMany(mappedBy="foo", orphanRemoval=true)
如果您正在使用JPA 2.0,则现在可以使用@xxxToMany
注释的orphanRemoval=true
属性来删除孤立项。
实际上, CascadeType.DELETE_ORPHAN
已经在3.5.2-Final中被弃用了。
╔═════════════╦═════════════════════╦═════════════════════╗ ║ Action ║ orphanRemoval=true ║ CascadeType.ALL ║ ╠═════════════╬═════════════════════╬═════════════════════╣ ║ delete ║ deletes parent ║ deletes parent ║ ║ parent ║ and orphans ║ and orphans ║ ╠═════════════╬═════════════════════╬═════════════════════╣ ║ change ║ ║ ║ ║ children ║ deletes orphans ║ nothing ║ ║ list ║ ║ ║ ╚═════════════╩═════════════════════╩═════════════════════╝
如果您在EclipseLink中使用JPA,则必须设置@PrivateOwned注释。
文档: Eclipse Wiki – 使用EclipseLink JPA扩展 – 第1.4章如何使用@PrivateOwned注解
你可以使用@PrivateOwned删除孤儿例如
@OneToMany(mappedBy = "masterData", cascade = { CascadeType.ALL }) @PrivateOwned private List<Data> dataList;
根据Hibernate的Java持久性 , 级联孤立删除不可用作为JPA注释。
它在JPA XML中也不受支持。
我只是find这个解决scheme,但在我的情况下,它不工作:
@OneToMany(cascade = CascadeType.ALL, targetEntity = MyClass.class, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true)
orphanRemoval = true不起作用。
只是@OneToMany(cascade = CascadeType.ALL, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true)
。
删除targetEntity = MyClass.class ,它的工作很好。
我有同样的问题,我想知道为什么下面的这个条件不删除孤儿。 在执行命名的删除查询时,Hibernate(5.0.3.Final)中没有删除菜肴列表:
@OneToMany(mappedBy = "menuPlan", cascade = CascadeType.ALL, orphanRemoval = true) private List<Dish> dishes = new ArrayList<>();
然后我记得我不能使用一个命名的删除查询 ,但是EntityManager。 当我使用EntityManager.find(...)
方法获取实体,然后使用EntityManager.remove(...)
删除它时,菜肴也被删除。
对于logging,在JPA2之前的OpenJPA中是@ElementDependant。
我正在使用一对一的映射,但是孩子没有被删除JPA正在给外键违规
使用orphanRemoval = true后,问题得到解决
- 为什么复合键在hibernate时不鼓励?
- 与JPA Kotlin:默认构造函数地狱
- hibernate oracle序列产生很大的差距
- Apache Commons equals / hashCode builder
- Spring事务和hibernate.current_session_context_class
- HQL或Java持久性查询语言中的IN子句
- org.hibernate.annotations与javax.persistence
- DAO与ORM(hibernate)模式
- Hibernate EnVers中的@NotAudited和RelationTargetAuditMode.NOT_AUDITED有什么区别?