You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 04:18:16