休眠: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)


大话西游666
浏览 607回答 3
3回答

沧海一幻觉

问题是您试图访问分离对象中的集合。您需要在访问当前会话的集合之前重新附加对象。您可以通过session.update(object);使用lazy=false不是一个好的解决方案,因为您将放弃休眠的惰性初始化功能。如果为lazy=false,则在请求对象的同时将集合加载到内存中。这意味着,如果我们有一个包含1000个项目的集合,则无论我们是否要访问它们,它们都将被加载到内存中。这不好。请阅读本文,其中解释了问题,可能的解决方案以及为什么以这种方式实现。

交互式爱情

这通常意味着拥有的Hibernate会话已经关闭。您可以执行以下任一操作来修复它:使用哪个对象创建此问题,请使用 HibernateTemplate.initialize(object name)使用lazy=false您的HBM文件。

慕哥9229398

如果您将休眠与JPA注释一起使用,则这将很有用。在您的服务类中,应该使用@PersistenceContext为实体管理器设置一个设置器。将其更改为@PersistenceContext(type = PersistenceContextType.EXTENDED)。然后,您可以在任何地方访问惰性属性。
打开App,查看更多内容
随时随地看视频慕课网APP