Java Hibernate一对多映射不工作
大学与学生实体之间存在一对多关系 学院Java Hibernate一对多映射不工作,java,hibernate,hibernate-mapping,hibernate-criteria,Java,Hibernate,Hibernate Mapping,Hibernate Criteria,大学与学生实体之间存在一对多关系 学院 @Entity public class College { private int collegeId; private String collegeName; private List<Student> students; @Id @GeneratedValue public int getCollegeId() { return collegeId; } public void setCollegeId(int colleg
@Entity
public class College {
private int collegeId;
private String collegeName;
private List<Student> students;
@Id
@GeneratedValue
public int getCollegeId() {
return collegeId;
}
public void setCollegeId(int collegeId) {
this.collegeId = collegeId;
}
public String getCollegeName() {
return collegeName;
}
public void setCollegeName(String collegeName) {
this.collegeName = collegeName;
}
@OneToMany(targetEntity=Student.class, mappedBy="college", cascade=CascadeType.ALL, fetch=FetchType.EAGER )
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
}
我是hibernate的新手,因此根据我的理解,如果我将fetchtype设置为fetchtype.EAGER,那么每当我查询单个学院对象时,与学生对象相关的对象都会自动获取。我使用了以下查询:
College college = (College) session.get(College.class, id);
college对象已正确加载,但当我作为回报说college.getStudents时,我将得到null。是我遗漏了什么,还是这是正确的快速获取方法。您的代码看起来不错,但您能否尝试下面的内容,并让我们知道它是否有效 您在College.java中的代码行: 请尝试将其替换为:
希望这对您有所帮助。您的代码看起来还可以,但请尝试下面的内容,让我们知道它是否有效 您在College.java中的代码行: 请尝试将其替换为:
希望这对您有所帮助。我不得不问:您是否100%确定有数据。请出示您的服务代码,这是不可能的。Hibernate永远不会为您提供空集合。如果它不是急切加载的,它会延迟加载,如果学院没有任何学生,它会返回一个非空列表。向我们展示一个复制问题的完整测试,打开SQL日志记录,并告诉我们真正发生了什么。发生这种情况的唯一方法是,如果您自己在同一会话中创建了学院并将集合保留为空。请检查配置的AccessType。access属性允许您控制Hibernate在运行时如何访问属性。默认情况下,Hibernate将调用属性get/set对。如果指定access=field,Hibernate将绕过get/set对,使用反射直接访问该字段。您可以通过命名一个实现接口org.hibernate.property.PropertyAccessor的类来指定自己的属性访问策略。如果集合将包含数据并延迟加载,那么如果没有打开会话,它将从hibernate引发LazyInitializationException。因此,请确保有映射到该字段的实际数据。确保您的代码正常,请提供您的服务类代码,我认为您缺少setCollege,即student.setCollegeCollegeClassObject;我不得不问:你是否100%确定有数据。请出示您的服务代码,这是不可能的。Hibernate永远不会为您提供空集合。如果它不是急切加载的,它会延迟加载,如果学院没有任何学生,它会返回一个非空列表。向我们展示一个复制问题的完整测试,打开SQL日志记录,并告诉我们真正发生了什么。发生这种情况的唯一方法是,如果您自己在同一会话中创建了学院并将集合保留为空。请检查配置的AccessType。access属性允许您控制Hibernate在运行时如何访问属性。默认情况下,Hibernate将调用属性get/set对。如果指定access=field,Hibernate将绕过get/set对,使用反射直接访问该字段。您可以通过命名一个实现接口org.hibernate.property.PropertyAccessor的类来指定自己的属性访问策略。如果集合将包含数据并延迟加载,那么如果没有打开会话,它将从hibernate引发LazyInitializationException。因此,请确保有映射到该字段的实际数据。确保您的代码正常,请提供您的服务类代码,我认为您缺少setCollege,即student.setCollegeCollegeClassObject;
College college = (College) session.get(College.class, id);
@OneToMany(targetEntity=Student.class, mappedBy="college", cascade=CascadeType.ALL, fetch=FetchType.EAGER )
public List<Student> getStudents() {
return students;
}
@OneToMany(targetEntity=Student.class, mappedBy="college", cascade=CascadeType.ALL, fetch=FetchType.EAGER )
@JoinColumn(name="college_id") // join column is in table for Student
public List<Student> getStudents() {
return students;
}