2

同じRPCリクエストのコンテキストで実行されるさまざまなコード部分全体で同じPersistenceManagerインスタンスが使用されるようにする方法はありますか?

関数間で永続性マネージャーインスタンスを手動で処理する必要があるのは非常に面倒です。

例えば:

private void updateItem(ItemModel listItem)
        throws UserNotLoggedInException {
   PersistenceManager pm = PMF.get().getPersistenceManager();
   if (isItemIsNew(pm, listItem)) { 
        workOnItem(pm, listItem);
   }
   workSomeMoreOnItem(pm, listItem);

}
4

1 に答える 1

2

Googleクックブックは次の答えを提供します。

フィルタを使用すると、PersistenceManagerを使用可能にして、リクエストの最後に閉じられることを保証できます。Springなどのレンダリングを処理するMVCフレームワークを使用している場合、これは、ビューがまだアクセスされていない永続オブジェクトをフェッチできるように、マネージャーを十分に長く開いたままにしておく場合にも役立ちます。

public final class PersistenceFilter implements Filter {
    private static final PersistenceManagerFactory persistenceManagerFactory
        = JDOHelper.getPersistenceManagerFactory("transactions-optional");

    private static PersistenceManagerFactory factory() {
        return persistenceManagerFactory;
    }

    private static ThreadLocal currentManager = new ThreadLocal();

    public static PersistenceManager getManager() {
        if (currentManager.get() == null) {
            currentManager.set(factory().getPersistenceManager());
        }
        return currentManager.get();
    }
    @Override
    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException {
        PersistenceManager manager  = null;
        try {
            manager = getManager();
            //Optional: allow all persistent objects implementing a custom interface
            //to be notified of when they are saved and loaded.
            manager.addInstanceLifecycleListener(new PersistHookListener(), PersistHooks.class);
            chain.doFilter(req, res);
        } finally {
            if (manager != null) {
                manager.flush();
                manager.close();
            }
        }
    }
    @Override
    public void init(FilterConfig arg0) throws ServletException {}
    @Override
    public void destroy() {}
}

http://appengine-cookbook.appspot.com/recipe/persistencefilter/?id=ahJhcHBlbmdpbmUtY29va2Jvb2tyigELEgtSZWNpcGVJbmRleCI2YWhKaGNIQmxibWRwYm1VdFkyOXZhMkp2YjJ0eUVnc1NDRU5oZEdWbmIzSjVJZ1JLWVhaaERBDAsSBlJlY2lwZSI3YWhKaGNIQmxibWRwYm1VdFkyOXZhMkp2YjJ0eUVnc1NDRU5oZEdWbmIzSjVJZ1JLWVhaaERBMAw

于 2010-01-07T15:21:09.140 に答える