我有两个实体。我想要项目和任务之间的双向关系。


一个项目有一个或多个任务
一项任务仅与一个项目关联


有我的实体:



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。

10-08 02:49