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 或条件查询:
我对 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 或条件查询: