这里有一个让我感到困惑的问题。我正在尝试实现一个基本的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)
发布于 2010-09-03 20:15:44
问题是,您正在尝试访问detached对象中的集合。在将集合访问到当前会话之前,需要重新附加对象。您可以通过以下方式完成此操作
session.update(object);
使用lazy=false
不是一个好的解决方案,因为您正在丢弃hibernate的延迟初始化特性。如果为lazy=false
,则在请求对象的同时将集合加载到内存中。这意味着如果我们有一个包含1000个项目的集合,它们都将被加载到内存中,无论我们是否要访问它们。这可不是什么好事。
请阅读此article,其中解释了问题、可能的解决方案以及为什么以这种方式实现。此外,要理解会话和事务,您必须阅读this other article。
发布于 2011-02-17 04:05:51
请看我的文章。我也遇到了同样的问题-- LazyInitializationException --这是我最终想出的答案:
http://community.jboss.org/wiki/LazyInitializationExceptionovercome
设置lazy=false不是答案-它可以一次加载所有内容,这不一定是好的。示例:
1记录表A引用:
5记录表B引用:
25记录表C引用:
125记录表D
..。
等等。这只是可能出错的一个例子。
--蒂姆·萨宾
发布于 2010-09-26 21:50:21
如果您正在使用带有JPA注释的hibernate,那么这将非常有用。在您的服务类中,应该有一个带有@PersistenceContext的实体管理器的setter。将其更改为@PersistenceContext(类型= PersistenceContextType.EXTENDED)。然后你可以在任何地方访问惰性属性。
https://stackoverflow.com/questions/345705
复制相似问题