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
添加到业务方法将确保在方法调用期间存在相同的会话,并防止出现此错误和其他相关错误。
- IllegalArgumentException:Type不能为null
- JPA2.0支持自定义用户类型和二级缓存
- 通过查询来hibernate多对多数据检索
- java.lang.NoSuchMethodError:org.hibernate.SessionFactory.openSession()Lorg / hibernate / classic / Session
- 复杂的Hibernate预测
- BeanFactory未初始化或已关闭 – 之前调用’刷新’
- 在JPA查询中排序返回Child对象
- Hibernate,spring,JPS和隔离 – 不支持自定义隔离
- 引起:org.hibernate.AnnotationException:mappedBy引用未知的目标实体属性