Java Hibernate-处理“问题”;ObjectDeletedException“;

Java Hibernate-处理“问题”;ObjectDeletedException“;,java,hibernate,jpa,Java,Hibernate,Jpa,我检查了其他问题(,),但没有找到我需要的 我正在修改一些现有代码以添加功能。我需要删除不同表中的一系列相关记录。问题是大多数实体类不是用级联Hibernate逻辑实现的,但其中一些是。因此,当我到达最后一个集合时,这个集合中的一些记录已经被删除,而其中一些还没有删除。其中两个表Account和Address之间的关系如下所示: @OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST}) @JoinColumn(name = "AD

我检查了其他问题(,),但没有找到我需要的

我正在修改一些现有代码以添加功能。我需要删除不同表中的一系列相关记录。问题是大多数实体类不是用级联Hibernate逻辑实现的,但其中一些是。因此,当我到达最后一个集合时,这个集合中的一些记录已经被删除,而其中一些还没有删除。其中两个表Account和Address之间的关系如下所示:

@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集合中的所有内容,不管它是否已被删除。除了重写所有的实体类之外,还有什么方法可以解决这个问题吗?我是否需要将每次删除都包装在一个单独的事务中,然后继续并让它们级联?告诉事务不要回滚错误,继续并提交,这样安全吗

更新

下面是它调用的服务方法和SimpleParepository方法。Javakid是正确的-SimpleParepository方法有自己的
@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);
    }
}

看起来它可以简化,但至少它是可行的。现在无法重做表,但这可能是更好的解决方案。

accountService.delete()和addressService.delete()是否在不同的事务中工作?如果实体在同一事务中已被删除,Hibernate将忽略对该实体的remove()调用。我们需要查看您的服务方法实现。我怀疑您删除了一些实体,然后调用update()来“更新已删除的状态”,这可能会导致发布的异常失败。当您更改对象状态(添加新子对象、更改内部属性、删除)时,执行同步的是flush(),或者调用flush的是transaction commit()。我更新了问题-Javakid是正确的,存在内部事务。更新Hibernate对象以匹配内部事务中正在发生的事情似乎暂时可行。非常感谢。如果你想发布一个答案,我很乐意标记为正确。
    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());
    }