我已检查过其他问题(here,here),但未找到我需要的内容。
我正在修改一些现有代码以添加功能。我需要在不同的表中删除一系列相关记录。问题是大多数实体类没有使用级联Hibernate逻辑实现,但其中一些是。因此,当我到达最后一个集合时,此集合中的一些记录已被删除,而其中一些记录尚未删除。两个表(帐户和地址)之间的关系如下所示:
@OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST})
@JoinColumn(name = "ADDRESS_ID", nullable = false)
private Address address;
这导致了一个问题,因为我得到了一个
org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.ObjectDeletedException: deleted instance passed to merge
当我到达后续删除时:
//This has embedded Accounts
MasterRecord myMaster = masterService.findOne(someNumber);
if (myMaster.getAccounts() != null) {
// These have embedded Addresses
accountService.delete(myMaster.getAccounts());
}
if (myMaster.getAddresses() != null) {
// Some of these are already deleted because of the previous statement
// ERROR OCCURS HERE
addressService.delete(myMaster.getAddresses());
}
我似乎无法让Hibernate理解我只想删除Addresses集合中的所有内容,无论它是否已被删除。有没有办法绕过这个,没有重写所有实体类,这真的不是一个选项?我是否需要将每个删除包装在一个单独的事务中并继续让它们级联?只是告诉事务不回滚该错误,继续并提交是否安全?
更新
这是它调用的服务方法和SimpleJpaRepository方法。 Javakid是正确的 - SimpleJpaRepository方法有自己的@Transaction
注释。
// Service Method
public void delete(Iterable<? extends T> entities) {
repository.delete(entities);
}
//Repository method
@Transactional
public void delete(Iterable<? extends T> entities) {
for (T entity : entities) {
delete(entity);
}
}
删除外部交易并从帐户内删除每个地址似乎有效:
if (myMaster.getAccounts() != null) {
for (Account account : myMaster.getAccounts()) {
addressService.delete(account.getAddress());
myMaster.getAddresses().remove(account.getAddress());
account.setAddress(null);
}
accountService.delete(myMaster.getAccounts());
}
似乎它可以简化,但至少它可以工作。现在无法重做表格,但这可能是更好的解决方案。