org.hibernate.LazyInitializationException:无法初始化代理 – 没有会话?

我试图从数据库中的对象进行简单加载,但我得到错误“无法初始化代理 – 没有会话”,任何想法? 谢谢

org.hibernate.LazyInitializationException: could not initialize proxy - no Session org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.jav a:167) org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215) org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190) com.myapp.domain.User_$$_javassist_0.getLogin(User_$$_javassist_0.java) com.myapp.validator.UserFormValidator.validate(UserFormValidator.java:34) 

 @Component public class UserFormValidator implements Validator { @Autowired private UserDAO userDAO; @Override public boolean supports(Class clazz) { return UserForm.class.equals(clazz); } public UserDAO getUserDAO() { return userDAO; } public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } @Override public void validate(Object target, Errors errors) { User user = (User)getUserDAO().findById(new Integer(1)); System.out.println ("User -> " + user.getLogin()); } } 

 @Transactional public class GenericDAOHibernateImpl  implements GenericDAO { public GenericDAOHibernateImpl() { super(); } private Class type; @Resource(name = "sessionFactory") private SessionFactory sessionFactory; public GenericDAOHibernateImpl(Class type) { this.type = type; } public void saveOrUpdate(T object) { getSession().save(object); } public Object findById(Serializable id) { return getSession().load(type, id); } protected Session getSession() { return sessionFactory.getCurrentSession(); } } 

              

 @Entity @Table(name="USER") public class User extends appEntity { @Id @Column(name = "USER_ID", unique = true, nullable = false) private Integer id; @Column(name = "LOGIN") private String login; @Column(name = "PASSWORD") private String password; public String getLogin() { return login; } public void setLogin(String login) { this.login = login; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } 

尝试将@Transactional添加到validate方法:

 @Override @Transactional(readOnly=true) public void validate(Object target, Errors errors) { ... } 

会发生什么是因为没有@Transactional注释,所以没有与该方法关联的会话,并且每个查询将在其自己的会话中运行,该会话之后立即关闭。

session.load()方法总是返回一个代理,与session.get() 不同 (请参阅此处了解load与get之间的差异 )。

因此返回代理,但由于缺少@Transactional ,创建代理的会话立即关闭。 当第一次访问代理时,它的会话被关闭,因此我们得到“无会话”错误。

如果从load()更改为get()只会部分解决问题,因为如果在尝试加载之后尝试加载例如延迟初始化集合,则会再次发生exception。

@Transactional添加到业务方法将确保在方法调用期间存在相同的会话,并防止出现此错误和其他相关错误。