【发布时间】:2023-03-27 09:55:02
【问题描述】:
我有以下课程:
public class Entity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long Id;
private String name;
@JsonManagedReference
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Category category;
//Constructors, getters and setters
}
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long Id;
private String name;
@JsonBackReference
@OneToMany(mappedBy = "category", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<Entity> entity;
//Constructors, getters and setters
}
我有一个表单,当我提交表单时,我得到以下 JSON:
{
id: "1"
name: "EntityA"
category: {
id: "4"
name: "categoryA"
}
}
CategoryA 已在数据库中。当我将 EntityA 对象(主对象)持久化到数据库时,两个对象都将被持久化。
有什么问题?
问题是该类别将使用相同的信息但具有不同的 id 再次持久化。因此,当我将上述对象 EntityA 持久保存在数据库中时,它会很好地保存,但即使它存在于数据库中,也会以不同的 id 再次保存类别。
以下是从数据库的角度来看的步骤。
初始数据库:
实体表(空)
|id | name | category_id |
--------------------------
| | | |
分类表
| id | name |
----------------
| 4 |categoryA|
Entity_category 表(空)
| entity_id | category_id |
---------------------------
| | |
坚持后
实体表(空)
id | name | category_id |
--------------------------
1 |EntityA| 5 |
Entity_category 表(不应为空,而是为空)
| entity_id | category_id |
---------------------------
| | |
分类表
id | name |
--------------
4 |categoryA|
5 |categoryA|
我想要的只是当我持久化 EntityA 的对象时,它不会持久化类别,而是更新它与 EntityA 的关系。持久化后第二个视图的 category_id 应该是 4 而不是 5。
我使用实体管理器的 persist() 方法来持久化对象。
我使用的技术是 jackson 2.0、Hibernate、Postgres 作为数据库。
我也测试过@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
两个类上方的注释,但没有帮助。
我在这里做错了什么?任何帮助表示赞赏。
【问题讨论】: