延迟加载不会在需要时检索

时间:2014-02-26 12:13:44

标签: java spring hibernate

我有一个以这种方式引用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

3 个答案:

答案 0 :(得分:1)

此时您还没有开放会话,因此代码无法访问数据库。

我猜你在UserService上有一个交易(通常是你把它放在服务层上),因为你正在访问服务层之外的懒惰属性,你的交易和会话就会被关闭。默认情况下,会话绑定到事务。

或者:

  • 将此代码也放在会话中
  • 确保在离开交易之前填充所有必填字段
  • 使此代码具有事务性(在内部事务上传播)
  • 使用OpenSessionInView(警告:这里是龙)

答案 1 :(得分:0)

尝试在配置中将singleSession参数更改为true,并查看该案例Lazy initialization problem.

答案 2 :(得分:0)

附加了OpenSessionInViewFilter源并在getSession()和closeSession()方法中添加了一些停止,很明显它没有被使用。进一步搜索显示web.xml中的过滤器映射的顺序在这方面是重要的。 将OpenSessionInViewFilter的过滤器映射移动到我的servlet过滤器之前解决了问题。

感谢所有回复的人。