gpt4 book ai didi

java - Hibernate LazyInitializationException - 如何解决此问题?

转载 作者:行者123 更新时间:2023-12-02 08:04:08 25 4
gpt4 key购买 nike

我有一个数据库,其中用户和地址数据存储在单独的表中。当用户登录我的页面时,我想向他展示一个表单,他可以通过该表单更改他的用户/帐户数据。但是,我最终得到一个异常:org.hibernate.LazyInitializationException:无法初始化代理 - 无 session 。无法加载地址属性。用户加载得很好,这就是我不明白的地方。我的 AddressDAOImpl 看起来像这样:

@Autowired
private SessionFactory sessionFactory;
public void addAddress(Address address)
{
sessionFactory.getCurrentSession().save(address);
}
public void updateAddress(Address address)
{
sessionFactory.getCurrentSession().update(address);
}
public List<Address> listAddress()
{
return sessionFactory.getCurrentSession().createQuery("from address").list();
}
public void deleteAddress(int id)
{
Address addr = (Address) sessionFactory.getCurrentSession().load(Address.class, id);
if(addr != null)
{
sessionFactory.getCurrentSession().delete(addr);
}
}
public Address getAddress(int id)
{
return (Address) sessionFactory.getCurrentSession().load(Address.class, id);
}

我的 Controller 执行此操作:

@RequestMapping("/library/home")
public ModelAndView showHome()
{
String username = SecurityContextHolder.getContext().getAuthentication().getName();
User user = userService.getUser(username);
Address address = addressService.getAddress(user.getId());
ModelMap mmap = new ModelMap();
mmap.addAttribute("user", user);
mmap.addAttribute("addresse", address);
return new ModelAndView("/library/home", mmap);
}

为什么这不起作用?为什么它适用于用户数据?

最佳答案

我假设您的 AddressService 创建了用于加载 Address 代理的事务(它是一个代理,因为您使用了 load() 而不是 get())。当您从 AddressService 返回地址时,与此事务关联的 session 将关闭。

当您的 View 解析器尝试访问地址代理的属性时,没有可用的 session 可以运行数据库查询来获取属性。因此异常(exception)。

要么使用 get() 而不是 load(),要么在事务范围内访问属性。

关于java - Hibernate LazyInitializationException - 如何解决此问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8434320/

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