我有两个实体。我想要项目和任务之间的双向关系。
一个项目有一个或多个任务
一项任务仅与一个项目关联
有我的实体:
ProjectEntity.java
@Entity
@Table(name = "projects")
public class ProjectEntity {
@Id
@GeneratedValue
@Column(name = "pr_id")
private long id;
@Column(name = "pr_name", nullable = false)
private String name;
@OneToMany(cascade=CascadeType.ALL, mappedBy="project",orphanRemoval=true)
@JsonBackReference
private Set<TaskEntity> tasks = new HashSet<TaskEntity>();
// Getters, constructors, setters
TaskEntity.java
@Entity
@Table(name = "tasks")
public class TaskEntity {
@Id
@GeneratedValue
@Column(name = "ta_id")
private long id;
@Column(name = "ta_name")
private String name;
@ManyToOne
@JoinColumn(name="pr_id")
@JsonManagedReference
private ProjectEntity project;
// Getters, constructors, setters
我想在每个
ProjectEntity
中以及在每个TaskEntity
相关项目中都有任务列表。在这里,我正在使用
@JsonManagedReference
和@JsonBackReference
停止它生成的无限递归,但是在我的ProjectEntity
中,我没有任务列表(由于@JsonBackReference
)...您能帮我找回
ProjectEntity
中的任务列表吗?我听说过@JsonIdentifyInfo
,但是我没有做到。希望我可以理解:)
最佳答案
您可以选择为列表ProjectEntity.tasks实现自定义序列化程序。但是您必须在某个时候控制/停止序列化周期;这将取决于您的要求。
这是我的意思的一个例子。
@Entity
@Table(name = "projects")
public class ProjectEntity {
...
@OneToMany(cascade=CascadeType.ALL, mappedBy="project", orphanRemoval=true)
@JsonSerialize(using = CustomListSerializer.class)
private Set<TaskEntity> tasks = new HashSet<TaskEntity>();
}
而且CustomListSerializer可能是这样的,
public class CustomListSerializer extends JsonSerializer<List<TaskEntity>>{
@Override
public void serialize(List<TaskEntity> tasks, JsonGenerator generator, SerializerProvider provider)
throws IOException, JsonProcessingException {
generator.writeStartArray();
for (TaskEntity task : tasks) {
generator.writeStartObject("taskEntity")
.write("id", task.id)
.write("name", task.name)
.write("project", task.project.id) //<- here you stop the cycle
.writeEnd();
}
generator.writeEnd();
}
}
请注意,它基本上是mentioned mini guide的示例,但是它序列化了项目任务列表元素的信息,而不是仅序列化任务ID。