Hibernate 无法延迟初始化 collection 角色无法初始化代理 - 否 Session
Hibernate failed to lazily initialize a collection of role could not initialize proxy - no Session
我一直在试图弄清楚如何让它与延迟获取类型一起工作,但我不太明白。
@Entity
@Table(name = "module")
public class Module extends ReservationOption{
@Column
private String name;
@Column
private int credits;
@Column
private int weeks;
@Column(name = "no_of_lectures")
private int noOfLectures;
@Column(name ="no_of_practicals")
private int noOfPracticals;
@Column(name = "lecture_length")
private int lectureLength;
@Column(name = "practical_length")
private int practicalLength;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
name = "takes",
joinColumns = @JoinColumn(name = "moduleID"),
inverseJoinColumns = @JoinColumn(name = "studentID")
)
private Set<Student> students = new HashSet<>();
public void addTakes(Student student){
IDatabase db = Database.getInstance();
if(!db.checkInTable(Student.class, student.getId())) db.add(student);
Hibernate.initialize(students);
students.add(student);
student.getModules().add(this);
db.update(this);
}
@Entity
@Table(name = "student")
public class Student extends Person{
/**
* Constructor for Student class, allows for object creation
* @param id From Person
* @param firstName From Person
* @param lastName From Person
*/
public Student(String id, String firstName, String lastName) {
super(id, firstName, lastName);
}
/**
* Blank constructor to allow for database interfacing
*/
public Student(){
super();
}
@ManyToMany(mappedBy = "students", fetch = FetchType.LAZY)
private Set<Module> modules = new HashSet<>();
@Override
public Set<Module> getModules() {
return modules;
}
public void setModules(Set<Module> modules) {
this.modules = modules;
}
}
在线Hibernate.initialize(学生)抛出错误;或者在下一行,如果不存在,在学生集中,标题中有错误。任何帮助(不仅仅是将获取类型设置为 Eager)将不胜感激。
有多种选择:
- 对映射关系调用方法
- 在 JPQL 中获取连接
- 在条件中获取连接 API
- 命名实体图
- 动态实体图
详情请阅读:
https://thorben-janssen.com/5-ways-to-initialize-lazy-relations-and-when-to-use-them/
检查代码路径以确保会话是显式或隐式(例如通过注释)创建的。
“无会话”错误通常意味着您正在尝试调用 Hibernate 行为(即初始化,或只是访问一个惰性变量),但没有 Transaction/Session 资源启动以使其在其中运行。
通常当我过去发生这种情况时,是因为它是普通的 java 代码,要么没有适当地设置 Hibernate(因此,不存在可以固定的 Session),要么我设置了启动 Hibernate,但代码找到的路径从未命中 @Transactional 注释,因此没有设置会话。
我一直在试图弄清楚如何让它与延迟获取类型一起工作,但我不太明白。
@Entity
@Table(name = "module")
public class Module extends ReservationOption{
@Column
private String name;
@Column
private int credits;
@Column
private int weeks;
@Column(name = "no_of_lectures")
private int noOfLectures;
@Column(name ="no_of_practicals")
private int noOfPracticals;
@Column(name = "lecture_length")
private int lectureLength;
@Column(name = "practical_length")
private int practicalLength;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
name = "takes",
joinColumns = @JoinColumn(name = "moduleID"),
inverseJoinColumns = @JoinColumn(name = "studentID")
)
private Set<Student> students = new HashSet<>();
public void addTakes(Student student){
IDatabase db = Database.getInstance();
if(!db.checkInTable(Student.class, student.getId())) db.add(student);
Hibernate.initialize(students);
students.add(student);
student.getModules().add(this);
db.update(this);
}
@Entity
@Table(name = "student")
public class Student extends Person{
/**
* Constructor for Student class, allows for object creation
* @param id From Person
* @param firstName From Person
* @param lastName From Person
*/
public Student(String id, String firstName, String lastName) {
super(id, firstName, lastName);
}
/**
* Blank constructor to allow for database interfacing
*/
public Student(){
super();
}
@ManyToMany(mappedBy = "students", fetch = FetchType.LAZY)
private Set<Module> modules = new HashSet<>();
@Override
public Set<Module> getModules() {
return modules;
}
public void setModules(Set<Module> modules) {
this.modules = modules;
}
}
在线Hibernate.initialize(学生)抛出错误;或者在下一行,如果不存在,在学生集中,标题中有错误。任何帮助(不仅仅是将获取类型设置为 Eager)将不胜感激。
有多种选择:
- 对映射关系调用方法
- 在 JPQL 中获取连接
- 在条件中获取连接 API
- 命名实体图
- 动态实体图
详情请阅读: https://thorben-janssen.com/5-ways-to-initialize-lazy-relations-and-when-to-use-them/
检查代码路径以确保会话是显式或隐式(例如通过注释)创建的。
“无会话”错误通常意味着您正在尝试调用 Hibernate 行为(即初始化,或只是访问一个惰性变量),但没有 Transaction/Session 资源启动以使其在其中运行。
通常当我过去发生这种情况时,是因为它是普通的 java 代码,要么没有适当地设置 Hibernate(因此,不存在可以固定的 Session),要么我设置了启动 Hibernate,但代码找到的路径从未命中 @Transactional 注释,因此没有设置会话。