gpt4 book ai didi

spring - 如何不允许从跨国方法之外延迟加载?

转载 作者:行者123 更新时间:2023-12-02 01:34:38 26 4
gpt4 key购买 nike

我将 JPA 与 Hibernate 和 Spring 一起使用。我有一个实体(比如员工),它有一个属性(比如职位类型),这个属性是延迟加载的。

我相信当您尝试访问 position 属性时,它会从数据库中延迟加载,这是在跨国方法中完成的。

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

在这一点上,我需要它为空(或未初始化),无论我以后以不同的方法访问它,但事实并非如此!问题是我们如何在提交和关闭 session 后使它为空,因为在 session 打开时它没有被访问?

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

// 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;
}

稍后我调用上面的方法(从某个 Controller 说):

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?

最佳答案

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

Hibernate - Avoiding LazyInitializationException - Detach Object From Proxy and Session

基本上

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

关于spring - 如何不允许从跨国方法之外延迟加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31929115/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com