理想的には、Userオブジェクトには を返すメソッドがありList<UnownedObject>、呼び出し元がクリーンな API を取得できるようになります。これを行う 1 つの方法は、Userオブジェクトが DAO のインスタンスを持ち、DAO にクエリを実行するように要求できるようにすることです。
これを行うにPersistenceManagerは、リクエストが終了するまで を閉じることができません。これを行う 1 つの方法は、サーブレット フィルターを作成することです。
public class PersistenceManagerFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
request.setAttribute("pm", pm);
chain.doFilter(request, response);
} finally {
pm.close();
}
}
}
PersistenceManager次に、を DAO に注入できます。Guiceを使用する場合は、次のことができます。
@RequestScoped
public class UserDao {
private final PersistenceManager pm;
@Inject
UserDao(PersistenceManager pm) {
this.pm = pm;
}
public User getUser(parameters) {
Key key = createKey(parameters);
User user = pm.getObjectById(User.class, key);
user.setUserDao(this);
return user;
}
}
UserDaoこれは、同じパッケージ内にある場合に最適に機能し、パッケージ スコープにUserなる可能性があります。の代わりにをオブジェクトにUser.setUserDao()設定することもできます。PersistenceManagerUserUserDao
次に、バインドする Guice モジュールを作成する必要がありますPersistenceManager。
public class PersistenceManagerModule extends AbstractModule {
@Override
protected void configure() {
}
@Provides @RequestScoped
PersistenceManager providePersistenceManager(HttpServletRequest request) {
return (PersistenceManager) request.getAttribute("pm");
}
}
最後に、Guice を使用するように Google App Engineを構成する必要があります。
これは、それを行うための 1 つの可能な方法にすぎません。providePersistenceManagerサーブレット フィルタで を作成するのではなく、 を作成しPersistenceManagerてリクエスト属性として保存する方が賢明かもしれませんPersistenceManager(フィルタは引き続きそれを閉じます)。また、サーブレット フィルターに Guice インジェクターを取得させることもできます。これにより、使用を避けsetAttribute()、getAttribute()代わりによりタイプ セーフな API を使用することができます。