gpt4 book ai didi

java - Hibernate : could not initialize proxy - no Session 中的 LazyInitializationException

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:04:56 24 4
gpt4 key购买 nike

我从我的服务中调用 dao

@Override
@Transactional
public Product getProductById(int id) {
return productDao.getProductById(id);
}

在 dao 中我得到的产品是

@Override
public Product getProductById(int id) {
Product p = sessionFactory.getCurrentSession().load(Product.class, id);
System.out.print(p);
return p;
}

这运行良好,但如果我将我的 dao 类更改为

@Override
public Product getProductById(int id) {
return sessionFactory.getCurrentSession().load(Product.class, id);
}

我收到 org.hibernate.LazyInitializationException:无法初始化代理 - 无 session 。异常发生在我正在打印产品的 View 层中。我不明白为什么在 dao 方法的同一行中返回会导致 View 层出现异常,但如果我将其保存在引用中然后返回它,则工作正常。

最佳答案

这是一个很好的reference让您熟悉 .get() 和 .load() 方法的工作原理。

@Override
public Product getProductById(int id) {
Product p = sessionFactory.getCurrentSession().load(Product.class, id);
return p;
}

session.load() 默认返回一个代理对象而不访问数据库。如果表中没有任何记录,它基本上会返回 NoObjectFoundError,否则它会返回一个引用,而不会填充实际对象,甚至不会访问数据库。您的上述方法返回一个代理,并且由于它还必须初始化您的对象,因此 session 保持打开状态并填充对象。

@Override
public Product getProductById(int id) {
return sessionFactory.getCurrentSession().load(Product.class, id);
}

但是在你的第二种方法中,基本上是在没有任何初始化的情况下返回一个代理。 session 在没有任何事先使用的情况下关闭。因此你得到了错误。

希望对你有帮助

关于java - Hibernate : could not initialize proxy - no Session 中的 LazyInitializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39054193/

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