could not initialize proxy - no Session

本文探讨了Hibernate中LazyInitializationException异常的原因及解决方法。当Session关闭前未完成代理对象的数据加载时,会出现此异常。文章提供了两种解决方案:一是禁用懒加载;二是强制加载代理对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值