我正在使用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?
答案 0 :(得分:2)
我认为这可能是您正在寻找的答案
Hibernate - Avoiding LazyInitializationException - Detach Object From Proxy and Session
基本上
Hibernate. isInitialized(fieldName)
初始化,如果未初始化则返回null。employeeDAO.getEmployeeById
内部方法中,创建一个新的Employee
对象,并设置从查询返回的参数,这样做更多,但阻止您将域与Hibernate耦合。