@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>
来处理关闭和其他与事务相关的事情。