Hibernate :could not initialize proxy - no Session

Java代码
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:132)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:174)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)

出现这种异常的本质原因是有点诡异,hibernate在获取一个Entity的时候,第一步获取到是Entity的Proxy. 如果仅仅在获取到Proxy以后Session就关闭的话,就会出现这个异常。在Hibernate3.0中,Entity的Proxy与真实实体之间默认是lazy loading的,如果在一个transaction仅仅获取了一下Entity的Proxy,然后transaction就commit, 这个时候也会出现上述异常。

譬如我们喜欢在Manager(Service)层上加上Transaction

Java代码
@Service("userManager")
@Transactional
public class UserManager extends BaseManager{

public User getUserById(long id){
User user = userDao.get(id);
return user;
}

}
这个时候拿到的其实是User实体的Proxy,结果在方法的最后提交transaction时就会有此异常。
解决方案:
1. 在Hibernate Mapping文件中设置实体的lazy="false"
2. 或者主动访问一下Entity属性, 迫使Proxy加载具体实体数据。

Java代码
@Service("userManager")
@Transactional
public class UserManager extends BaseManager{

public User getUserById(long id){
User user = userDao.get(id);
user.getName();
return user;
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值