Jea*_*art 26 java hibernate jpa jpql
MOTHER感谢JPQL查询,我试图删除大量的行.
所述Mother类的定义如下:
@Entity
@Table(name = "MOTHER")
public class Mother implements Serializable {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "mother",
orphanRemoval = true)
private List<Child> children;
}
@Entity
@Table(name = "CHILD")
public class Child implements Serializable {
@ManyToOne
@JoinColumn(name = "MOTHER_ID")
private Mother mother;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,Mother该类具有"子",并在执行以下查询时:
String deleteQuery = "DELETE FROM MOTHER WHERE some_condition";
entityManager.createQuery(deleteQuery).executeUpdate();
Run Code Online (Sandbox Code Playgroud)
抛出异常:
ERROR - ORA-02292: integrity constraint <constraint name> violated -
child record found
Run Code Online (Sandbox Code Playgroud)
当然,我可以首先选择我要删除的所有对象,然后在迭代它之前将它们检索到列表中以删除所有检索到的对象,但是这样的解决方案的性能会很糟糕!
那么有没有办法利用前面的映射来有效地删除所有Mother对象和Child与它们相关的所有对象,而无需首先为所有子项编写查询?
Mik*_*unu 35
DELETE(和INSERT)不会通过JPQL查询中的关系级联.这清楚地说明了规范:
删除操作仅适用于指定类及其子类的实体.它不会级联到相关实体.
幸运地坚持并通过实体管理器删除(当定义了级联属性时).
你可以做什么:
代码是这样的:
String selectQuery = "SELECT m FROM Mother m WHERE some_condition";
List<Mother> mothersToRemove = entityManager
.createQuery(selectQuery)
.getResultStream()
.forEach(em::remove);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
45256 次 |
| 最近记录: |