如何不允许来自跨国方法之外的延迟加载?

时间:2015-08-10 21:02:49

标签: spring hibernate jpa lazy-evaluation

我正在使用JPA与Hibernate和Spring。我有一个具有属性(Say类型为Position)的实体(Say Employee),此属性为 lazy-loaded

我相信当你尝试访问position属性时,它将从DB中延迟加载,这是在跨国方法中完成的。

假设我没有访问该跨国方法中的属性。因此,如果我稍后尝试访问它,我会得到“ org.hibernate.LazyInitializationException :无法初始化代理 - 没有会话”这是正常的,因为会话被该跨国方法关闭了。

此时,无论何时以不同方法访问它,我都需要null(或不初始化),但事实并非如此!问题是如何在提交和关闭会话后使其为空,因为在会话打开时不会访问它?

下面是一个简单的代码来说明问题。

// In some Service class
@Override
@Transactional(readOnly = true)
public Employee getEmployeeById(Integer id) throws Exception {

    Employee emp = employeeDAO.getEmployeeById(id);
    // I didn't access the position attribute here because I don't need it for now
    return emp;
}

后来我调用了上面的方法(来自某个控制器说):

Employee emp = employeeService.getEmployeeById(904);
System.out.println(emp.getPosition()); // Here, the LazyInitializationException
//would occur, but I need this to be null or at least to prevent the lazy loading, 
//thus, avoiding the exception. How?

1 个答案:

答案 0 :(得分:2)

我认为这可能是您正在寻找的答案

Hibernate - Avoiding LazyInitializationException - Detach Object From Proxy and Session

基本上

  • 使用Hibernate检查该字段是否在getter中使用Hibernate. isInitialized(fieldName)初始化,如果未初始化则返回null。
  • employeeDAO.getEmployeeById内部方法中,创建一个新的Employee对象,并设置从查询返回的参数,这样做更多,但阻止您将域与Hibernate耦合。