1

@ManyToOne目前我有一个与其父实体有关联的子实体。以前的开发人员已经将此字段设置为lazy="false"在会话关闭时在需要时获取父级,但是我决定它应该是lazy="true"因为它并不总是使用但是这样做时我遇到了LazyInitializationException,因为会话已关闭并且子级与尝试获取父级时的会话。

我想知道将如下所示的方法的更多逻辑移动run到与 s 交互的服务类是否正确,DAO因此我可以避免异常,因为当前服务类就像普通类一样,DAO注入了所需的 s 并且它们只是调用方法并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>来处理关闭和其他与事务相关的事情。

4

2 回答 2

3

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

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

于 2011-06-23T17:32:18.410 回答
0

创建 DTO,不要通过网络发送 JPA 实体。

创建 DTO 时,您必须访问所需的属性,以及触发加载它们的条件。

于 2011-06-23T16:37:05.777 回答