我有一个以这种方式引用Department的User bean:
@Column(name = "DEPARTMENT_ID", length = 2)
public String getDepartmentId() {
return this.departmentId;
}
public void setDepartmentId(String departmentId) {
this.departmentId = departmentId;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "DEPARTMENT_ID", nullable = false, insertable=false, updatable=false)
public Department getDepartment() {
return this.department;
}
public void setDepartment(Department department) {
this.department = department;
}
..并在部门
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "department")
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
在我的javax.servlet.Filter实现中,我尝试从我的User bean引用Department bean,如下所示:
UserService userService = (UserService) SpringApplicationContext.getBean("userService");
User user = userService.getUser(userId);
user.setDepartmentName(user.getDepartment().getName());
我明白了:
org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话
这是userService.getUser():
public User getUser(String userId) throws ApplicationException {
User user = null;
try {
user = userDAO.findById(userId);
}
catch(Exception e) {
ApplicationException.handleThrowable(e, userId, this.getClass());
}
return user;
}
..和userDAO.findById():
public User findById(String id) {
return ( User )getSession().get( User.class, id );
}
我还应该提一下,我正在使用OpenSessionInViewFilter:
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory</param-value>
</init-param>
<init-param>
<param-name>singleSession</param-name>
<param-value>false</param-value>
</init-param>
</filter>
那么有人可以告诉我为什么LazyInitializationException?
谢谢!
顺便说一句,我正在使用Hibernate 3.6.10和Spring 3.2.4
答案 0 :(得分:1)
此时您还没有开放会话,因此代码无法访问数据库。
我猜你在UserService上有一个交易(通常是你把它放在服务层上),因为你正在访问服务层之外的懒惰属性,你的交易和会话就会被关闭。默认情况下,会话绑定到事务。
或者:
答案 1 :(得分:0)
尝试在配置中将singleSession参数更改为true,并查看该案例Lazy initialization problem.
答案 2 :(得分:0)
附加了OpenSessionInViewFilter源并在getSession()和closeSession()方法中添加了一些停止,很明显它没有被使用。进一步搜索显示web.xml中的过滤器映射的顺序在这方面是重要的。 将OpenSessionInViewFilter的过滤器映射移动到我的servlet过滤器之前解决了问题。
感谢所有回复的人。