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;
}
}
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;
}
}