Repository.saveAll 抛出 InvalidDataAccessApiUsageException

时间:2021-06-06 10:17:22

标签: spring hibernate spring-data

我使用 Spring 查询一个 Bugzilla REST API,它返回一个具有以下结构的 JSON 对象: https://bugzilla.mozilla.org/rest/bug/35

我有以下 JPA 类(摘录):

@Entity
@Table
public class bug {
....
@ManyToOne (fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn (name = "assigned_to_user_id")
@SerializedName ("assigned_to_detail")
protected BugUser assignedTo;

@ManyToMany (cascade = CascadeType.ALL)
@JoinColumn (/ * ... shortened ... * /)
@SerializedName ("c_detail")
protected List <BugUser> cc;
...
}

Web 服务调用是在 Spring 剩余模板的帮助下进行的。然后对象从其余模板映射到我的 JPA 类。但是,当数据集被 Spring 存储库持久化时,出现以下异常:

<块引用>

引起:org.springframework.dao.InvalidDataAccessApiUsageException: 同一实体 [BugUser #2] 的多种表示正在被 合并。分离:[BugUser @ 21];分离:[BugUser @ 12];

只要我在 Bug 类中只注释一个 BugUser 类型的成员变量,一切正常。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您必须确保只有一个对象具有相同的主键。您可以在合并之前浏览列表并执行以下操作:

Bug b = ...
BugUser assignee = b.assignedTo;
ListIterator<BugUser> iter = b.cc.listIterator();
while (iter.hasNext()) {
    if (assignee.id.equals(iter.next().id) {
        iter.set(assignee);
    }
}

这样就可以保证同一个主键的列表中的对象和受托人是一样的。这正是 Hibernate 抱怨的原因。

相关问题