1

現在、@ManyToOne親エンティティに関連付けられている子エンティティがあります。以前の開発者はlazy="false"、セッションが閉じられたときに必要なときにいつでも親を取得するようにこのフィールドを設定しましたlazy="true"が、常に使用されるとは限らないため、そうする必要があると判断しましたが、そうするとLazyInitializationException、セッションが閉じられ、子が親を取得しようとしたときのセッション。

run以下に示すように、メソッドのロジックをsと相互作用するサービスクラスに移動するのが正しいかどうか疑問に思っていました。したがって、現在、サービスクラスは、必要なsが挿入されDAOたプレーンクラスのようなものであり、単に呼び出すだけなので、例外を回避できます。メソッドと結果を返しますDAODAOエンティティと対話するサービスクラスにもっと多くのメソッドを配置する必要があります。これにより、ユーザーが取得され、ログインアクションのすべてがチェックされ、必要に応じて親が取得され、ログイン結果が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を呼び出し元のフロントエンドアプリケーションに返送する必要があることに同意します。休止状態のエンティティはプロキシでいっぱいであり、それらを送り返すのは非効率的です。これらのオブジェクトをjsp/speed / etcファイルに送信するのか、外部アプリケーションに送信するのかはよくわかりませんが、JSONまたは呼び出し元のアプリケーションに類似したものを返送する場合はDTOを使用することをお勧めします。簡単に変換するための2つのフレームワークについて説明している、DTOのここをクリックに関する別の質問があります。

于 2011-06-23T17:32:18.410 に答える
0

DTOを作成し、JPAエンティティをネット経由で送信しないでください。

DTOを作成するときは、必要なプロパティにアクセスする必要があります。これにより、DTOがロードされます。

于 2011-06-23T16:37:05.777 に答える