如何在Java中将双向实体映射到DTO

时间:2016-09-26 12:07:02

标签: java jpa mapstruct

有人可以帮我解决这个问题吗?我尝试使用mapstruct,它工作得很好但仅适用于没有双向关系的实体。

例如,我有实体:

@Entity
public class Pacients implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int pacientId;

    // bi-directional many-to-one association to Doctori
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "doctorId")
    private Doctors doctor;

    //setters and getters
}

@Entity
public class Doctors implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int doctorId;

    // bi-directional many-to-one association to Pacienti
    @OneToMany(mappedBy = "doctor")
    private List<Pacients> pacients;

    //setters and getters
}

DTO的:

public class PacientsDto implements Serializable {


    private int pacientId;
    private Doctors doctor;

    //setters and getters
}


public class DoctorsDto implements Serializable {

    private int doctorId;

    private List<Pacients> pacients;

    //setters and getters
}

当我尝试在dto上映射它时,由于这种双向关系,我得到了一个StackOverflowError。

我知道如何解决这个问题?我也会接受一个不使用mapstruct的解决方案。

如果需要任何细节,请告诉我。 谢谢!

2 个答案:

答案 0 :(得分:2)

您有两种映射方法,一种用于映射医生,另一种用于映射患者。在后者中,您建议生成器忽略对医生的引用。然后,您可以使用@AfterMapping自定义设置之后的医生参考。

答案 1 :(得分:-1)

请使用注释JsonManagedReference for ManyToOne和JsonBackReference for OneToMany