理想的には、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()
設定することもできます。PersistenceManager
User
UserDao
次に、バインドする 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 を使用することができます。