Hibernate 和 Jackson 与额外字段的多对多关系
Hibernate and Jackson manyToMany relation with extra fields
最近我一直在尝试通过多对多关系 link 模块 table 和 Activity table。
此关系欢迎添加如下字段。
-------------------------------------------------------------
| Module | ModuleHasActivities | Activities |
-------------------------------------------------------------
| id | Module_idModule | id |
| Name | Activity_idActivity | Name |
| Observations | Day | Price |
-------------------------------------------------------------
我使用 JsonManagedReference 和 JsonBackReference 来避免无限循环。不幸的是,结果不是预期的,因为我没有从活动中获得模块列表,反之亦然。返回的唯一信息是实体字段。
@Entity
@Table(name = "Module")
public class Module implements Serializable {
@Id
@GeneratedValue
@Column(name = "idModule")
private int id;
// Other fields plus getter and setter
@OneToMany(mappedBy = "module", cascade = CascadeType.ALL)
@JsonBackReference
private Set<ModuleHasActivities> moduleHasActivities = new HashSet<>();
}
@Entity
@Table(name = "Activite")
public class Activite implements Serializable {
@Id
@GeneratedValue
@Column(name = "idActivite")
private int id;
// Other fields
@OneToMany(mappedBy = "activite", cascade = CascadeType.ALL)
@JsonBackReference
private Set<ModuleHasActivities> moduleHasActivities = new HashSet<>();
}
@Entity
@Table(name = "Module_has_Activite")
public class ModuleHasActivities implements Serializable {
@Id
@ManyToOne
@JoinColumn(name = "Module_idModule")
@JsonManagedReference
private Module module;
@Id
@ManyToOne
@JoinColumn(name = "Activite_idActivite")
@JsonManagedReference
private Activite activite;
@Column(name = "IdJour")
private int jour;
}
查询模块响应:
[
{
"id": 1,
"code": "TT1",
"title": "Test 1",
"description": "Nothing",
"observations": "Nothing",
}
]
我期望的(类似这样的):
[
{
"id": 1,
"code": "TT1",
"title": "Test 1",
"description": "Nothing",
"observations": "Nothing",
"activities": [
"day1":
{
//fields of activities
},
"day2":
{
//fields of activities
},
]
}
]
当我调试 hibernate 的 SQL 查询时,我们发现连接从未完成。这就是我感兴趣的!缺少模块 table 的关节。
不胜感激,
谢谢
已经访问过 links :
Extra fields for many to many relations
您需要了解 JsonManagedReference
和 JsonBackReference
之间的区别。请参阅: 了解更多信息。
@Entity
public class Module {
@JsonBackReference
private Set<ModuleHasActivities> moduleHasActivities = new HashSet<>();
}
@Entity
public class ModuleHasActivities implements Serializable {
@JsonManagedReference
private Module module;
}
在这里,如果您序列化 Module 对象,您将不会在 json 中获得 moduleHasActivities
字段,但如果您序列化 ModuleHasActivities 对象,您将获得 module
字段。
所以,解决方案是翻转 @JsonBackReference
和@JsonManagedReference
如下:
@Entity
public class Module {
@JsonManagedReference
private Set<ModuleHasActivities> moduleHasActivities = new HashSet<>();
}
@Entity
public class ModuleHasActivities implements Serializable {
@JsonBackReference
private Module module;
}
终于,我解决了我的问题。我没有使用复合键,而是更改了数据库模型以使用主 id 键和 2 个对相关表的引用。映射更容易,我得到了我的信息。
最近我一直在尝试通过多对多关系 link 模块 table 和 Activity table。 此关系欢迎添加如下字段。
-------------------------------------------------------------
| Module | ModuleHasActivities | Activities |
-------------------------------------------------------------
| id | Module_idModule | id |
| Name | Activity_idActivity | Name |
| Observations | Day | Price |
-------------------------------------------------------------
我使用 JsonManagedReference 和 JsonBackReference 来避免无限循环。不幸的是,结果不是预期的,因为我没有从活动中获得模块列表,反之亦然。返回的唯一信息是实体字段。
@Entity
@Table(name = "Module")
public class Module implements Serializable {
@Id
@GeneratedValue
@Column(name = "idModule")
private int id;
// Other fields plus getter and setter
@OneToMany(mappedBy = "module", cascade = CascadeType.ALL)
@JsonBackReference
private Set<ModuleHasActivities> moduleHasActivities = new HashSet<>();
}
@Entity
@Table(name = "Activite")
public class Activite implements Serializable {
@Id
@GeneratedValue
@Column(name = "idActivite")
private int id;
// Other fields
@OneToMany(mappedBy = "activite", cascade = CascadeType.ALL)
@JsonBackReference
private Set<ModuleHasActivities> moduleHasActivities = new HashSet<>();
}
@Entity
@Table(name = "Module_has_Activite")
public class ModuleHasActivities implements Serializable {
@Id
@ManyToOne
@JoinColumn(name = "Module_idModule")
@JsonManagedReference
private Module module;
@Id
@ManyToOne
@JoinColumn(name = "Activite_idActivite")
@JsonManagedReference
private Activite activite;
@Column(name = "IdJour")
private int jour;
}
查询模块响应:
[
{
"id": 1,
"code": "TT1",
"title": "Test 1",
"description": "Nothing",
"observations": "Nothing",
}
]
我期望的(类似这样的):
[
{
"id": 1,
"code": "TT1",
"title": "Test 1",
"description": "Nothing",
"observations": "Nothing",
"activities": [
"day1":
{
//fields of activities
},
"day2":
{
//fields of activities
},
]
}
]
当我调试 hibernate 的 SQL 查询时,我们发现连接从未完成。这就是我感兴趣的!缺少模块 table 的关节。
不胜感激,
谢谢
已经访问过 links : Extra fields for many to many relations
您需要了解 JsonManagedReference
和 JsonBackReference
之间的区别。请参阅:
@Entity
public class Module {
@JsonBackReference
private Set<ModuleHasActivities> moduleHasActivities = new HashSet<>();
}
@Entity
public class ModuleHasActivities implements Serializable {
@JsonManagedReference
private Module module;
}
在这里,如果您序列化 Module 对象,您将不会在 json 中获得 moduleHasActivities
字段,但如果您序列化 ModuleHasActivities 对象,您将获得 module
字段。
所以,解决方案是翻转 @JsonBackReference
和@JsonManagedReference
如下:
@Entity
public class Module {
@JsonManagedReference
private Set<ModuleHasActivities> moduleHasActivities = new HashSet<>();
}
@Entity
public class ModuleHasActivities implements Serializable {
@JsonBackReference
private Module module;
}
终于,我解决了我的问题。我没有使用复合键,而是更改了数据库模型以使用主 id 键和 2 个对相关表的引用。映射更容易,我得到了我的信息。