这是让我困惑的一个。我正在尝试实现基本的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个项目的集合,则无论我们是否要访问它们,它们都将被加载到内存中。这不好。
请阅读本文,其中解释了问题,可能的解决方案以及为什么以这种方式实现。
交互式爱情
TA贡献1712条经验 获得超3个赞
这通常意味着拥有的Hibernate会话已经关闭。您可以执行以下任一操作来修复它:
使用哪个对象创建此问题,请使用 HibernateTemplate.initialize(object name)
使用lazy=false您的HBM文件。
慕哥9229398
TA贡献1877条经验 获得超6个赞
如果您将休眠与JPA注释一起使用,则这将很有用。在您的服务类中,应该使用@PersistenceContext为实体管理器设置一个设置器。将其更改为@PersistenceContext(type = PersistenceContextType.EXTENDED)。然后,您可以在任何地方访问惰性属性。
添加回答
举报
0/150
提交
取消