Java 惰性加载休眠,正确的方式和一些疑问

Java 惰性加载休眠,正确的方式和一些疑问,java,hibernate,lazy-loading,Java,Hibernate,Lazy Loading,我想知道为什么这两种方法在延迟加载时会有一些不同(“因为我期望得到相同的结果”),这两种方法都使用lazy=true和fetch=“select” 进近1号 Session miasession = HibernateUtil.getSessionFactory().getCurrentSession(); Invoice i = (Invoice) miasession.get(Invoice.class, id); //the Subject entity is Many to

我想知道为什么这两种方法在延迟加载时会有一些不同(“因为我期望得到相同的结果”),这两种方法都使用lazy=true和fetch=“select”

进近1号

Session miasession = HibernateUtil.getSessionFactory().getCurrentSession();

Invoice i = (Invoice) miasession.get(Invoice.class, id);    

//the Subject entity is Many to One relation
model.addAttribute("subject", i.getSubject());
在这种方法中,当我尝试访问“subject”时,我得到一个错误,错误是“org.hibernate.LazyInitializationException:无法初始化代理-无会话”(这是堆栈跟踪)

2号进近

Session miasession = HibernateUtil.getSessionFactory().getCurrentSession();

Invoice i = (Invoice) miasession.get(Invoice.class, id);            

Subject s = (Subject) miasession.get(Subject.class, i.getSubject().getId());

//the Subject entity is Many to One relation
model.addAttribute("subject", s);
这一个有效,但我不知道前一个方法为什么不起作用


PS:这是一段伪代码,在这个方法之外处理事务,我只报告了一些代码来说明问题:)

如果您不想在第一种方法中得到错误,您可以使用如下方法:

Session miasession = HibernateUtil.getSessionFactory().getCurrentSession();

Invoice i = (Invoice) miasession.get(Invoice.class, id); 

// load the collection before session is closed
model.addAttribute("subject", Hibernate.initialize(i.getSubject()));

解决懒惰问题的另一种方法是在web中使用OpenSessionInViewFilter。xml

在第一种方法中,调用
getSubject
时,
MiaseSession
是否仍然可用?@NahuelFouilleul是的,它可以从堆栈跟踪中使用,此时不会发生异常,在
getSubject
上,但在
getname
上,是的,它出现在getname上,但为什么在方法2中没有出现?似乎,在第一种方法中,我需要访问getSubject()的1个随机属性才能使用所有其他属性Hibernate.initialize解决了我的问题:)非常感谢Pierpaolo。因此,这背后的原因是,在延迟加载中,我需要告诉hibernate我需要初始化什么对象,我的方法2是一个简单的解决方法,不是吗?只需对代码进行一点编辑。。Hibernate.Inizalize没有返回类型,因此首先需要调用Hibernate.initialize(i.getSubject()),然后调用model.addAttribute(“subject”,i.getSubject());