Java org.hibernate.LazyInitializationException:无法初始化代理-在使用急切初始化时没有会话

Java org.hibernate.LazyInitializationException:无法初始化代理-在使用急切初始化时没有会话,java,hibernate,jpa,orm,Java,Hibernate,Jpa,Orm,我有hibernate映射: 前置词: @Entity @Table(name = "prepod") public class Prepod { private Long id; private String name; @Column public String getName() { return name; } public void setName(String name) { this.name =

我有hibernate映射:

前置词:

@Entity
@Table(name = "prepod")
public class Prepod {

    private Long id;
    private String name;
    @Column
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    List<Student> students = new ArrayList<Student>();

    @ManyToMany(fetch=FetchType.EAGER)
    public List<Student> getStudents() {
        return students;
    }

    public void setStudents(List<Student> students) {
        this.students = students;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    public Long getId() {
        return id;
    }

    public void setId(Long i) {
        id = i;
    }
}
@实体
@表(name=“prepd”)
公共类介词{
私人长id;
私有字符串名称;
@纵队
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
List students=new ArrayList();
@ManyToMany(fetch=FetchType.EAGER)
公众学生名单{
留学生;
}
公立学校学生(名单学生){
这个。学生=学生;
}
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id”)
公共长getId(){
返回id;
}
公共无效设置ID(长i){
id=i;
}
}
学生:

@Entity
@Table(name = "Student")
public class Student {

    private Long id;
    private String name;
    private Long age;
    private List<Prepod> prepods = new ArrayList<Prepod>();

    @ManyToMany(mappedBy = "students",fetch=FetchType.EAGER)
    public List<Prepod> getPrepods() {
        return prepods;
    }

    public void setPrepods(List<Prepod> prepods) {
        this.prepods = prepods;
    }

    public Student() {
        name = null;
    }

    public Student(Student s) {
        name = s.getName();
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    public Long getId() {
        return id;
    }

    @Column(name = "name")
    public String getName() {
        return name;
    }

    @Column(name = "age")
    public Long getAge() {
        return age;
    }

    public void setId(Long i) {
        id = i;
    }

    public void setName(String s) {
        name = s;
    }

    public void setAge(Long age) {
        this.age = age;
    }
}
@实体
@表(name=“Student”)
公立班学生{
私人长id;
私有字符串名称;
私人长寿;
private List preposd=new ArrayList();
@ManyToMany(mappedBy=“students”,fetch=FetchType.EAGER)
公共列表getPrepDS(){
返回介词;
}
公共void setprepDS(列表prepDS){
this.preposds=preposds;
}
公立学生(){
name=null;
}
公立学生{
name=s.getName();
}
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id”)
公共长getId(){
返回id;
}
@列(name=“name”)
公共字符串getName(){
返回名称;
}
@列(name=“age”)
公共长假{
回归年龄;
}
公共无效设置ID(长i){
id=i;
}
公共void集合名(字符串s){
name=s;
}
公共空间设置(长时间){
这个。年龄=年龄;
}
}
调用代码:

Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        Prepod prepod = (Prepod) session.load(Prepod.class, 1l);
        Student student = (Student) session.load(Student.class, 1l);
        session.getTransaction().commit();
        session.flush();
        session.close();
                List<Student> students = new ArrayList<Student>();
        students.add(student);

        List<Prepod> prepods = new ArrayList<Prepod>();
        prepods.add(prepod);

        prepod.setStudents(students);//exception here
        student.setPrepods(prepods);
....
会话会话=HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); prepd prepd=(prepd)session.load(prepd.class,1l); 学生=(学生)课时负荷(学生班级,1l); session.getTransaction().commit(); session.flush(); session.close(); List students=new ArrayList(); 学生。添加(学生); List preposd=new ArrayList(); 添加(prepd); 预备班学生(学生)//这里例外 student.setPrepods(prepods); .... 当我调用上面的代码时,我会看到下一个跟踪:

线程“main”org.hibernate.LazyInitializationException中的异常: 无法初始化代理-服务器上没有会话 org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:164) 在 org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:285) 在 org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185) 在 logic.prepd\u$$\ uJavassist\u1.setStudents(prepd\u$$\ uJavassist\u1.java) at logic.Main.Main(Main.java:38)

这个问题的原因是什么

我的对象的状态在最后两行中分离

如何修复它

更新

在收到Prabhakaran关于编辑代码的好建议后,我有一个问题:

若我更新了student-note,那个么它并没有添加到数据库的中间表中,而是添加了另一个行为,若我更新了prepod实体。发生这种情况是因为prepd是关系的所有者?

prepd-prepd=null;
    Prepod prepod = null;
    Student  student = null;
    Session session = HibernateUtil.getSessionFactory().openSession();
    session.beginTransaction();
    prepod = (Prepod) session.load(Prepod.class, 1l);
    student = (Student) session.load(Student.class, 1l);
    session.getTransaction().commit();
    session.flush();
    session.close();
            List<Student> students = new ArrayList<Student>();
    students.add(student);

    List<Prepod> prepods = new ArrayList<Prepod>();
    prepods.add(prepod);

    prepod.getStudents().addAll(students);//exception here
    student.getPrepods().addAll(prepods);
Student=null; Session Session=HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); prepd=(prepd)session.load(prepd.class,1l); 学生=(学生)课时负荷(学生班级,1l); session.getTransaction().commit(); session.flush(); session.close(); List students=new ArrayList(); 学生。添加(学生); List preposd=new ArrayList(); 添加(prepd); prepod.getStudents().addAll(学生)//这里例外 student.getPrepDS().addAll(prepDS);
创建会话时出错:org.hibernate.AnnotationException:在关系的两侧非法使用mappedBy:logic.Student.prepDS异常在线程“main”java.lang.ExceptionInInitializeError位于logic.HibernateUtil.(HibernateUtil.java:51)位于logic.main.main(main.java:20)原因:org.hibernate.AnnotationException:在关系的两侧非法使用mappedBy:logic.Student.prepods