java - 延迟初始化异常 : load lazy attribute from a session different from the original one in Hibernate

标签 java mysql hibernate jpa

我是 hibernate 的初学者,尝试学习 eager 和 lazy loading

我知道如果关闭 hibernate session 然后我尝试检索惰性数据,那么 Hibernate 将抛出异常。

现在,我尝试在第一个 session 中加载主要实体(讲师),然后在新的单独 session 中加载依赖实体(类(class)):

主类(测试类)

public class EagerLazyDemo {
    public static void main(String[] args) {

        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
                .addAnnotatedClass(Instructor.class)
                .addAnnotatedClass(InstructorDetail.class)
                .addAnnotatedClass(Course.class)
                .buildSessionFactory();

        Session session = factory.getCurrentSession();

        // Begin A Transaction
        session.beginTransaction();

        // Get The Instructor From DB
        Instructor theInstructor = session.get(Instructor.class, 1);

        // Commit Transaction
        session.getTransaction().commit();

        session.close();

        //------

        //new session
        session = factory.getCurrentSession();
        session.beginTransaction();

        //Get And Display Courses For The Instructor
        List<Course> courses = theInstructor.getCourses();
        printCourses(courses);

        session.getTransaction().commit();
        session.close();

    }

    private static void printCourses(List<Course> courses) {
        for (Course c : courses) {
            System.out.println(c);
        }
    }
}

但是 hibernate 抛出这个异常:

错误:

Exception in thread "main" org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.mehdisarf.hibernate.demo.entity.Instructor.courses, could not initialize proxy - no Session
    at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:606)
    at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:218)
    at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:585)
    at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:149)
    at org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:387)
    at com.mehdisarf.hibernate.demo.EagerLazyDemo.printCourses(EagerLazyDemo.java:55)
    at com.mehdisarf.hibernate.demo.EagerLazyDemo.main(EagerLazyDemo.java:42)

它说:

could not initialize proxy - no Session Although I have a session for loading dependent entity

这些是我的实体类:

导师类(主体)

@Entity
@Table(name = "instructor")
public class Instructor {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @Column(name = "email")
    private String email;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "instructor_detail_id")
    private InstructorDetail instructorDetail;

    @OneToMany(fetch = FetchType.LAZY,
            mappedBy = "instructor",
            cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
    private List<Course> courses;

    public Instructor() {
    }

    public Instructor(String firstName, String lastName, String email) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
    }

    public void addCourse(Course theCourse) {
        if (courses == null) {
            courses = new ArrayList<>();
        }

        this.courses.add(theCourse);
        theCourse.setInstructor(this);
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public InstructorDetail getInstructorDetail() {
        return instructorDetail;
    }

    public void setInstructorDetail(InstructorDetail instructorDetail) {
        this.instructorDetail = instructorDetail;
    }

    public List<Course> getCourses() {
        return courses;
    }

    public void setCourses(List<Course> courses) {
        this.courses = courses;
    }

    @Override
    public String toString() {
        return id + "" + firstName + "" + lastName + "" + email + "  (Detail:" + instructorDetail+")";
    }
}

类(class)类别(依赖实体)

@Entity
@Table(name = "course")
public class Course {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @Column(name = "title")
    private String title;

    @ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
    @JoinColumn(name = "instructor_id")
    private Instructor instructor;

    public Course() {
    }

    public Course(String title) {
        this.title = title;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public Instructor getInstructor() {
        return instructor;
    }

    public void setInstructor(Instructor instructor) {
        this.instructor = instructor;
    }

    @Override
    public String toString() {
        return id + "|" + title + "|";
    }
}

最佳答案

您的对象 theInstructor 仍然链接到前一个 session 。为了检索您的对象,您必须在打开新 session 后再次调用: theInstructor = session.get(Instructor.class, 1);

关于java - 延迟初始化异常 : load lazy attribute from a session different from the original one in Hibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61601826/

相关文章:

java - 在 Eclipse 中显示命名查询建议/警告

java - Spring 是否要求所有 bean 都具有默认构造函数?

php - MySQL INSERT INTO 不工作

MySQL 和 Solr 的一致性,在插入时

java - 具有相同名称的私有(private)回调方法

hibernate - 在构造函数中使用多对一集合的 SELECT NEW() - HQL

java - 将值传递给方法 onSuccess

java - 为什么这段代码运行一段时间后总是不打印?

php - 在我的 PHP 脚本中找不到错误。有人可以指出给我吗

java - 带投影的 Hibernate Criteria 不选取数据