从Hibernate 5.6迁移到6后出现持久性错误

mmvthczy  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(231)

在将Quarkus 2.16迁移到3(以及Hibernate 5.6迁移到6)之后,我在持久化数据方面遇到了一个bug。基本上,我的schema看起来像这样:

  1. @Entity
  2. class Person {
  3. @Column(name = "name")
  4. private String name;
  5. @OneToMany(
  6. mappedBy = "owner",
  7. cascade = CascadeType.ALL,
  8. orphanRemoval = true,
  9. fetch = FetchType.EAGER
  10. )
  11. private Set<Pet> pets = new HashSet<>();
  12. }
  1. @Entity
  2. class Pet {
  3. @Column(name = "name")
  4. private String name;
  5. @JoinColumn(name = "fkidperson",
  6. referencedColumnName = "id")
  7. @ManyToOne(optional = false)
  8. private Person owner;
  9. @OneToMany(mappedBy = "pet",
  10. cascade = CascadeType.ALL,
  11. orphanRemoval = true,
  12. fetch = FetchType.EAGER)
  13. private Set<Food> foods = new HashSet<>();
  14. }
  1. @Entity
  2. class Food {
  3. @Column(name = "name")
  4. private String name;
  5. @JoinColumn(name = "fkidpet",
  6. referencedColumnName = "id")
  7. @ManyToOne(optional = false)
  8. private Pet pet;
  9. }

我会尝试用POST请求更新它,

  1. {
  2. "id": 2,
  3. "name": "John",
  4. "pets": [
  5. {
  6. "id": null,
  7. "name": "Fuffy",
  8. "foods": []
  9. }
  10. ]
  11. }

而在后端,我想用entityManager.merge(person)覆盖前一个人,但失败了,

  1. org.hibernate.AssertionFailure: null identifier for collection of role (Pet.foods)

在它工作之前。有什么想法吗?谢谢!

egdjgwm8

egdjgwm81#

这个问题可能是因为它正在初始化声明中的列表。
试试看:

  1. @Entity
  2. class Person {
  3. @Column(name = "name")
  4. private String name;
  5. @OneToMany(
  6. mappedBy = "owner",
  7. cascade = CascadeType.ALL,
  8. orphanRemoval = true,
  9. fetch = FetchType.EAGER
  10. )
  11. private Set<Pet> pets;
  12. }
  13. @Entity
  14. class Pet {
  15. @Column(name = "name")
  16. private String name;
  17. @JoinColumn(name = "fkidperson",
  18. referencedColumnName = "id")
  19. @ManyToOne(optional = false)
  20. private Person owner;
  21. @OneToMany(mappedBy = "pet",
  22. cascade = CascadeType.ALL,
  23. orphanRemoval = true,
  24. fetch = FetchType.EAGER)
  25. private Set<Food> foods;
  26. }
展开查看全部

相关问题