現在、@ManyToOne
親エンティティに関連付けられている子エンティティがあります。以前の開発者はlazy="false"
、セッションが閉じられたときに必要なときにいつでも親を取得するようにこのフィールドを設定しましたlazy="true"
が、常に使用されるとは限らないため、そうする必要があると判断しましたが、そうするとLazyInitializationException
、セッションが閉じられ、子が親を取得しようとしたときのセッション。
run
以下に示すように、メソッドのロジックをsと相互作用するサービスクラスに移動するのが正しいかどうか疑問に思っていました。したがって、現在、サービスクラスは、必要なsが挿入されDAO
たプレーンクラスのようなものであり、単に呼び出すだけなので、例外を回避できます。メソッドと結果を返しますDAO
。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>
して、クロージングやその他のトランザクション関連のものを処理します。