我在团队和玩家之间有一对多的关系,我可以使用以下 JSON 创建一个团队
{
"id": 1,
"name": "MyTeam5",
"players": [
{
"name": "player5"
},
{
"name":"player10"
}
]
}
但是,当我尝试通过使用以下 JSON 从列表中删除子对象来删除它时
{
"id": 1,
"name": "MyTeam5",
"players": [
{
"id": 2
"name": "player5"
}
]
}
我收到一条错误消息
"A collection with cascade=\"all-delete-orphan\" was no longer referenced by the owning entity instance: org.a.c.domain.user.Team.players"
这是我的团队和玩家实体代码 -
@Data
@Entity
public class Team {
@Id
@GeneratedValue
private Integer id;
private String name;
@JsonManagedReference
@OneToMany(mappedBy="team", cascade= CascadeType.ALL, orphanRemoval=true)
List<Player> players = new ArrayList<Player>();
}
@Data
@Entity
public class Player {
@Id
@GeneratedValue
private Integer id;
private String name;
@JsonBackReference
@ManyToOne
@JoinColumn(name = "team_id")
private Team team;
}
我究竟做错了什么?当我创建一个包含一群球员的新团队时, jackson 能够完美地映射一对多关系,但是当我从 Team json 更新/删除球员时,它会失败并出现同样的错误。是否有可能重新创建集合,这就是 hibernate 引发错误的原因,如果是这样,我应该如何修复它?请帮忙
最佳答案
您面临的问题来自更换 players
列表。 Hibernate 需要跟踪哪些元素被删除,并在特定列表实现的帮助下完成此操作(据我所知 PersistentList
)。
当您或其他人调用 setPlayers
时,问题最有可能出现。 .有效地用新实例替换列表。
要解决此问题,您有两种可能性:
setPlayers
通过使用 getPlayers.remove / add
setPlayers
以避免设置新列表,而是清除加载的列表并添加参数列表中的所有元素。 一个简单的例子:
public void setPlayers(List list) {
if (this.players == null) {
this.players = list;
} else {
this.players.clear();
this.players.addAll(list);
// you might need to take care of bidirectional references here
}
关于json - Spring数据休息一对多删除子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29901346/