【发布时间】:2011-06-23 16:12:32
【问题描述】:
目前我有一个子实体与它的父实体有一个@ManyToOne 关联。以前的开发人员已将此字段设置为lazy="false",以便在会话关闭时也可以在需要时获取父级,但是我决定它应该是lazy="true",因为它并不总是使用,但是这样做时我遇到了LazyInitializationException,因为会话已关闭,并且子级在尝试获取父级时与会话分离。
我想知道将run 方法的更多逻辑移动到与DAOs 交互的服务类中是否正确,因此我可以避免异常,因为目前服务类就像普通类一样注入所需的DAOs,他们只需调用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> 来处理关闭和其他与事务相关的事情。
【问题讨论】:
-
你有什么接口?网页界面?还是远程客户端?
-
那个运行方法是什么?我不能很好地理解你,但我认为这项工作应该在服务层完成,所以如果它有一个关联的数据库会话,它可能会从惰性关联中获取数据。如果您出于任何原因不想这样做,您可以在会话打开时强制初始化惰性字段并稍后使用它。在休眠中,您可以使用 'Hibernate.initialize(myBean.getMyLazyValue());'
-
注意第二段不清楚。我们不知道您的代码是什么样子...
-
对不起,添加了代码示例!希望现在有意义。
-
@Puce,它不是一个网络应用程序,不。就像游戏服务器一样。
标签: java business-logic service-layer lazy-initialization