Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate一对多映射不工作_Java_Hibernate_Hibernate Mapping_Hibernate Criteria - Fatal编程技术网

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;
}