JPA实体可以有多个OneToMany关联吗?

ste*_*n35 0 java orm hibernate jpa hibernate-mapping

OneToMany我的实体类中添加两个关联似乎无效。如果我删除其中之一,效果很好。

@Entity
@Table(name = "school")
public class School {

    private List<Teacher> teachers;
    private List<Student> students;

    @OneToMany(cascade=CascadeType.ALL, mappedBy = "school", fetch = FetchType.EAGER)
    public List<Teacher> getTeachers()
        return this.teachers;
    }
    public void setTeachers(List<Teacher> teachers) {
         this.teachers = teachers;
    }

    @OneToMany(cascade=CascadeType.ALL, mappedBy = "school", fetch = FetchType.EAGER)
    public List<Student> getStudents()
        return this.students;
    }
    public void setStudents(List<Student> teachers) {
         this.students = students;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在TeacherStudent我有正确的ManyToOne注释

@Entity
@Table(name = "teacher")
public class Teacher {
    private School school;

    @ManyToOne
    @JoinColumn(name = "school_id")
    public School getSchool() {
        return this.school;
    }
    public void setSchool(School school) {
        this.school = school;
    }
}

@Entity
@Table(name = "student")
public class Student {
    private School school;

    @ManyToOne
    @JoinColumn(name = "school_id")
    public School getSchool() {
        return this.school;
    }
    public void setSchool(School school) {
        this.school = school;
    }
}
Run Code Online (Sandbox Code Playgroud)

我也有id与正确的注释字段(@Id@GeneratedValue

所以对我来说@OneToMany,在同一堂课上,我似乎不能超过一个。它是否正确?

Vla*_*cea 5

您可以具有多个一对多关联,只要其中一个是EAGER即可

尽管您可以使用Set而不是List绕过此异常,但这并不是一件好事,因为您最终会得到笛卡尔积。

最好的办法是根本不使用EAGER。您应该对所有关联使用LAZY,并渴望通过查询时间FETCH指令和最多一个关联来获取many-to-one和关联。one-to-oneone-to-many

如果要获取多个one-to-many关联,则应将Hibernate.initialize(proxy)方法用于第二或第三关联,因为3个简单的select语句比笛卡尔乘积更好。