Hibernate配置FetchType.LAZY后懒加载未生效问题咨询
Hibernate懒加载行为不符合预期问题
背景
我正通过在线课程学习Hibernate框架,当前正在学习Eager(立即加载)与Lazy loading(懒加载)两种加载机制的区别。
在本次学习示例中,我定义了三个实体类以及对应的测试程序,相关代码如下:
实体类代码
Instructor 实体
@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; // constructors public void add(Course tempCourse) { if (courses == null) { courses = new ArrayList<>(); } if (tempCourse != null) { courses.add(tempCourse); tempCourse.setInstructor(this); } } // getters and setters @Override public String toString() { return "Instructor{" + "id=" + id + ", firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + ", email='" + email + '\'' + ", instructorDetail=" + instructorDetail + '}'; } }
InstructorDetail 实体
@Entity @Table(name = "instructor_detail") public class InstructorDetail { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private int id; @Column(name = "youtube_channel") private String youtubeChannel; @Column(name = "hobby") private String hobby; @OneToOne(mappedBy = "instructorDetail", cascade = { CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH }) private Instructor instructor; // constructors // getters and setters @Override public String toString() { return "InstructorDetail{" + "id=" + id + ", youtubeChannel='" + youtubeChannel + '\'' + ", hobby='" + hobby + '\'' + '}'; } }
Course 实体
@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(fetch = FetchType.LAZY, cascade = { CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) @JoinColumn(name = "instructor_id") private Instructor instructor; // constructors // getters and setters @Override public String toString() { return "Course{" + "id=" + id + ", title='" + title + '\'' + '}'; } }
主程序代码
package pt.hmsk.hibernate.demo; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import pt.hmsk.hibernate.demo.entity.Course; import pt.hmsk.hibernate.demo.entity.Instructor; import pt.hmsk.hibernate.demo.entity.InstructorDetail; public class EagerLazyDemo { public static void main(String[] args) { try (SessionFactory factory = new Configuration() .configure("hibernate.cfg.xml") .addAnnotatedClass(Instructor.class) .addAnnotatedClass(InstructorDetail.class) .addAnnotatedClass(Course.class) .buildSessionFactory(); Session session = factory.getCurrentSession()) { // start a transaction session.beginTransaction(); // get instructor from db int theId = 1; Instructor tempInstructor = session.get(Instructor.class, theId); System.out.println("luv2code: Instructor: " + tempInstructor); // get courses for the instructor System.out.println("luv2code: Courses: " + tempInstructor.getCourses()); // commit transaction session.getTransaction().commit(); System.out.println("luv2code: Done!"); } catch (Exception e) { e.printStackTrace(); } } }
问题描述
我在主程序的如下代码行设置了调试断点:
System.out.println("luv2code: Instructor: " + tempInstructor);
按照懒加载的预期逻辑,执行到该断点位置时,代码尚未访问courses字段,因此tempInstructor对象中不应加载关联的Course集合数据,但实际调试时发现Course数据已经被加载到Instructor对象中,调试截图参考:
现咨询该异常现象产生的具体原因。
内容的提问来源于stack exchange,提问作者msmilkshake
相关产品推荐
相关产品推荐

