Hibernate: could not initialize proxy - no Session

Java代码 复制代码
  1. org.hibernate.LazyInitializationException: could not initialize proxy - no Session   
  2.     at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:132)   
  3.     at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:174)   
  4.     at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)  
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代码 复制代码
  1. @Service("userManager")   
  2. @Transactional  
  3. public class UserManager extends BaseManager{   
  4.        
  5.     public User getUserById(long id){   
  6.         User user = userDao.get(id);   
  7.         return user;   
  8.     }   
  9.        
  10. }  
@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代码 复制代码
  1. @Service("userManager")   
  2. @Transactional  
  3. public class UserManager extends BaseManager{   
  4.        
  5.     public User getUserById(long id){   
  6.         User user = userDao.get(id);   
  7.         user.getName();   
  8.         return user;   
  9.     }   
  10.        
  11. }  
转自:http://storm0912.javaeye.com/blog/568681
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值