首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >hibernate: LazyInitializationException:无法初始化代理

hibernate: LazyInitializationException:无法初始化代理
EN

Stack Overflow用户
提问于 2008-12-06 01:32:28
回答 9查看 207.1K关注 0票数 75

这里有一个让我感到困惑的问题。我正在尝试实现一个基本的Hibernate DAO结构,但遇到了一个问题。

下面是必要的代码:

代码语言:javascript
复制
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上失败。下面是一个例外:

代码语言:javascript
复制
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)
EN

回答 9

Stack Overflow用户

发布于 2010-09-03 20:15:44

问题是,您正在尝试访问detached对象中的集合。在将集合访问到当前会话之前,需要重新附加对象。您可以通过以下方式完成此操作

代码语言:javascript
复制
session.update(object);

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

请阅读此article,其中解释了问题、可能的解决方案以及为什么以这种方式实现。此外,要理解会话和事务,您必须阅读this other article

票数 68
EN

Stack Overflow用户

发布于 2011-02-17 04:05:51

请看我的文章。我也遇到了同样的问题-- LazyInitializationException --这是我最终想出的答案:

http://community.jboss.org/wiki/LazyInitializationExceptionovercome

设置lazy=false不是答案-它可以一次加载所有内容,这不一定是好的。示例:

1记录表A引用:

5记录表B引用:

25记录表C引用:

125记录表D

..。

等等。这只是可能出错的一个例子。

--蒂姆·萨宾

票数 10
EN

Stack Overflow用户

发布于 2010-09-26 21:50:21

如果您正在使用带有JPA注释的hibernate,那么这将非常有用。在您的服务类中,应该有一个带有@PersistenceContext的实体管理器的setter。将其更改为@PersistenceContext(类型= PersistenceContextType.EXTENDED)。然后你可以在任何地方访问惰性属性。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/345705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档