Hibernate - 处理" ObjectDeletedException"

时间:2014-05-23 23:54:40

标签: java hibernate jpa

我已检查过其他问题(herehere),但未找到我需要的内容。

我正在修改一些现有代码以添加功能。我需要在不同的表中删除一系列相关记录。问题是大多数实体类没有使用级联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());
    }

似乎它可以简化,但至少它可以工作。现在无法重做表格,但这可能是更好的解决方案。

0 个答案:

没有答案