json - Spring数据休息一对多删除子对象

标签 json spring hibernate spring-data-jpa spring-data-rest

我在团队和玩家之间有一对多的关系,我可以使用以下 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/

    相关文章:

    javascript - Node.js应用程序中的reduce函数省略json json数据并且太麻烦

    javascript - 来自 JSON 数据的 Google map 标记未呈现标记

    java - 动态加载jar文件并使用xml创建spring beans

    java - Maven 存储库中 4.1.1 中的 spring-security-web 在哪里?

    javascript - Node.js 作为 JSON 转发器

    java - 在 Jackson 中映射动态 json 对象字段?

    java - Spring REST Doc未命名请求参数

    java - hibernate 不会创建 hbm2ddl.auto 设置为 "update"的中间表

    java - Jhipster 返回 org.hibernate.StaleStateException : Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

    java - Hibernate 查询示例 (QBE) 检查所有字段为空以确保安全