jpa多对多获取数据

qnzebej0  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(96)

我有两个实体雇员:

public class Employee implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int emp_id;

    private String name;

    private String email;

    private String phone;

    @ManyToMany(
            fetch = FetchType.LAZY, cascade = CascadeType.ALL

    )
    @JoinTable(name = "EMP_PRO_DB", joinColumns = {
            @JoinColumn(name = "empId", referencedColumnName = "emp_id")
    },
    inverseJoinColumns = {
            @JoinColumn(name = "proId", referencedColumnName = "pro_id")
    })
    private Set<Project> projects = new HashSet<>();

}

项目名称:

public class Project {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int pro_id;

    private String projectName;

    private String projectType;
    @JsonIdentityInfo(
            generator = ObjectIdGenerators.PropertyGenerator.class,
            property = "emp_id"
    )
    @ManyToMany(
            fetch = FetchType.LAZY, cascade = CascadeType.ALL

    )
    @JoinTable(name = "EMP_PRO_DB", joinColumns = {
            @JoinColumn(name = "proId", referencedColumnName = "pro_id")
    },
            inverseJoinColumns = {
                    @JoinColumn(name = "empId", referencedColumnName = "emp_id")
            })
    private Set<Employee> employees = new HashSet<>();
}

当我从employee获取所有数据时,json返回:

这是正确的,它可以显示员工的项目。
但是当我从项目中获取所有数据时,json返回给我:

员工1有两个项目,它显示了一个,员工2有一个项目,但它只显示ID,我需要该员工的详细信息(至少姓名)

toiithl6

toiithl61#

您似乎试图在EmployeeProject之间创建双向关系。
但是相反,您创建了两个概念上独立的关系,一个从EmployeeProject,另一个方向相反,它们恰好写入相同的表,这当然会引起麻烦。
解决方法是将其转换为正确的双向关系。
将关系的Project端更改为

@ManyToMany(
            fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedby="projects"
    )
    private Set<Employee> employees = new HashSet<>();

注意,在这个Map中,只有关系的Employee端在持久化时会被使用,您必须自己在Java端保持这两端的同步。

相关问题