gpt4 book ai didi

java - 如何更好地避免 LazyInitializationException?

转载 作者:行者123 更新时间:2023-11-29 06:11:59 25 4
gpt4 key购买 nike

目前我有一个子实体有一个 @ManyToOne关联到它的父实体。之前的开发者已经将这个字段设置为 lazy="false"在 session 关闭时也可以随时获取父级,但我决定它应该是 lazy="true"因为它并不总是被使用,但在这样做时我遇到了 LazyInitializationException因为 session 已关闭并且子进程在尝试获取父进程时与 session 分离。

我想知道移动更多 run 的逻辑是否正确与 DAO 交互的服务类的方法如下所示s 因此我可以避免异常,因为目前服务类就像具有所需的普通类 DAO被注入(inject),他们只是调用 DAO方法并返回结果。我是否应该在与实体交互的服务类中放置更多方法,这将获取用户并检查所有内容以进行登录操作,如果需要,获取父级,然后将登录结果返回给 run方法..

public class Login extends Runnable {
private UserService userService;
...
public void run() {
...
User user = userSerivce.getById(id);
Account account = user.getAccount(); //LazyInitializationException
...
if (account.isLocked()) {
...
}
...
userService.save(user);

//Send some message to the user..
}
}

public class UserServiceImpl implements UserService {
private UserDAO userDAO;
...
public User getById(long id) {
return userDAO.getById(id);
}
public void save(User user) {
userDAO.save(user);
}
}

public UserDAOImpl implements UserDAO {
private SessionFactory factory;
...
public User getById(long id) {
return (User) factory.getCurrentSession().load(User.class, id);
}
public void save(User user) {
factory.getCurrentSession().saveOrUpdate(user);
}
}

我使用 Spring 的 <tx:advice>处理关闭和其他交易相关的事情。

最佳答案

我更喜欢让我所有的实体关系都是惰性的,因为我不知道我是否以及何时需要这些外部实体。这样我就可以在不需要额外实体时避免不必要的连接。如果我最终需要实体,我会创建一个命名查询并急切地获取实体或集合。这是一个 example .

我确实同意您应该将 DTO 而不是实体发送回您的调用前端应用程序。 Hibernate 实体充满了代理,将它们发回是低效的。我不太确定你是将这些对象发送到 jsp/velocity/etc 文件还是外部应用程序,但如果你要发回 JSON 或类似于调用应用程序的东西,我建议使用 DTO。这是另一个处理 DTO 的问题 click here讨论了 2 个易于转换的框架。

关于java - 如何更好地避免 LazyInitializationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6457275/

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