JPA Hibernate 一对多

JPA Hibernate one to many

我对 JPA 中一对多的工作方式感到非常困惑,我阅读的所有文档在他们的示例中都使用了一对多和多对一,我不知道它们是否有必要,并且当我尝试时它不起作用。

我的问题是,假设我有两个 table,我想使用 findCollegeData() 方法填充 College 对象,这样当我初始化对象。

下面是我的方法,我可以使用 storeCollegeData() 方法将所有学生存储在大学列表中,但我无法完全检索大学对象,学生列表始终为空,即使数据在数据库中,如果我尝试直接使用大学名称搜索学生,它会起作用。

public static EntityManager entityManager = something;

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public College {
    @Id   
    @GeneratedValue(strategy= GenerationType.AUTO)
    private int cId;
    private String collegeName;
    private int numOfStudent;

    @OneToMany(mappedBy="collegeName", cascade=CascadeType.ALL, orphanRemoval=true)
    private List<Student> studentList = new ArrayList<>();
}


@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public Student {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private int sId;
    private String name;
    private String collegeName;
    private String city;
}


// college.getStudentList is always empty and I don't know why
public findCollegeData(String collegeName) {
    College college = entityManager.find(College.class, collegeName);
}

// Student data in the studentList are inserted into student table
public storeCollegeData(College college) {
    entityManager.persist(college);
}

// This method works
public findStudent(String collegeName) {

    CriteriaBuilder cb = provider.get().getCriteriaBuilder();
    CriteriaQuery<Student> query = cb.createQuery(Student.class);
    Root<Student> student = query.from(Student.class);

    query.where(
            cb.and(
                    cb.equal(student.get("collegeName"), collegeName)
            )
    );

    JobStatisticDB Student = provider.get().createQuery(query).getSingleResult();
}

我是不是漏了什么??? join 比 map 更合适吗???我不知道该做什么男人

已编辑: 通过添加 @Id 注释将两个 collegeName 更改为 table 的主键,使其工作,但是,如何将 sId 和 cId 添加到 table,以便它们可以重复学院名称????现在,我不能有同名的重复大学,而且学生去同一所大学!

最终编辑: 更改了数据库设计以使用外键,请参阅下面的解决方案

您在 mappedBy 中引用的字段必须包含等于 College 的 ID 字段的值。将其更改为 collegeName 而不是 city,它应该可以工作。

已接受的答案不正确:您定义了 实体 之间的关系。双向 @OneToMany

的映射应如下所示

大学:

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public College {
    @Id   
    @GeneratedValue(strategy= GenerationType.AUTO)
    private int cId;
    private String collegeName;
    private int numOfStudent;

    @OneToMany(mappedBy="college", cascade=CascadeType.ALL, orphanRemoval=true)
    private List<Student> studentList = new ArrayList<>();
}

学生:

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public Student {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private int sId;
    private String name;
    private String city;

    //student table has a FK column college_id 
    @ManyToOne
    @JoinColumn(name = "college_id")
    private College college;
}

EntityManager find() 将 PK 作为参数:

public findCollege(int collegeId) {
    College college = entityManager.find(College.class, collegeId);
    college.getStudents(); //will be populated
}

public findStudent(int studentId) {
    Student student = entityManager.find(Student.class, studentId);
    student.getCollege(); //will be populated
    student.getCollege().getStudents(); //will be populated
}

如果您想按名称查找大学,请创建 JPQL 或条件查询: