为了账号安全,请及时绑定邮箱和手机立即绑定

休眠:LazyInitializationException:无法初始化代理

休眠:LazyInitializationException:无法初始化代理

这是让我困惑的一个。我正在尝试实现基本的Hibernate DAO结构,但是遇到了问题。这是基本代码:int startingCount = sfdao.count();sfdao.create( sf );SecurityFiling sf2 = sfdao.read( sf.getId() );sfdao.delete( sf );int endingCount = sfdao.count();assertTrue( startingCount == endingCount );assertTrue( sf.getId().longValue() == sf2.getId().longValue() );assertTrue( sf.getSfSubmissionType().equals( sf2.getSfSubmissionType() ) );assertTrue( sf.getSfTransactionNumber().equals( sf2.getSfTransactionNumber() ) );它在尝试将sf中的值与sf2中的对应值进行比较的第三个assertTrue上失败。这是例外:org.hibernate.LazyInitializationException: could not initialize proxy - no Session    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:86)    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:140)    at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)    at com.freightgate.domain.SecurityFiling_$$_javassist_7.getSfSubmissionType(SecurityFiling_$$_javassist_7.java)    at com.freightgate.dao.SecurityFilingTest.test(SecurityFilingTest.java:73)    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:40)
查看完整描述

3 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

问题是您试图访问分离对象中的集合。您需要在访问当前会话的集合之前重新附加对象。您可以通过


session.update(object);

使用lazy=false不是一个好的解决方案,因为您将放弃休眠的惰性初始化功能。如果为lazy=false,则在请求对象的同时将集合加载到内存中。这意味着,如果我们有一个包含1000个项目的集合,则无论我们是否要访问它们,它们都将被加载到内存中。这不好。


请阅读本文,其中解释了问题,可能的解决方案以及为什么以这种方式实现。



查看完整回答
反对 回复 2019-10-28
?
交互式爱情

TA贡献1712条经验 获得超3个赞

这通常意味着拥有的Hibernate会话已经关闭。您可以执行以下任一操作来修复它:


使用哪个对象创建此问题,请使用 HibernateTemplate.initialize(object name)

使用lazy=false您的HBM文件。


查看完整回答
反对 回复 2019-10-28
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

如果您将休眠与JPA注释一起使用,则这将很有用。在您的服务类中,应该使用@PersistenceContext为实体管理器设置一个设置器。将其更改为@PersistenceContext(type = PersistenceContextType.EXTENDED)。然后,您可以在任何地方访问惰性属性。


查看完整回答
反对 回复 2019-10-28
  • 3 回答
  • 0 关注
  • 603 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信