PersistenceManager を使うサンプル

GAE/JPersistenceManager の使い回しでサンプルとして紹介されてる PMF.java
Wicket + Google guice で以下のように使用する。

import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory;
/**
 * PMF.java
 */

public final class PMF{
   private static final PersistenceManagerFactory pmfInstance 
= JDOHelper.getPersistenceManagerFactory("transactions-optional");

   private PMF(){}

   public static PersistenceManagerFactory get(){
      return pmfInstance;
   }
}

Wicket のWebApplication に init() で以下のようにバインド定義する

public class SampleApplication extends WebApplication{
   @Override
   protected void init(){
      final PersistenceManager persistenceManager = PMF.get().getPersistenceManager();
      // Guice インジェクション
      addComponentInstantiationListener(new GuiceComponentInjector(this,new Module[]{
         new AbstractModule(){
            @Override
            protected void configure(){
               binder().bind(PersistenceManager.class).toInstance(persistenceManager);
               // Dao のバインド定義
            }
         }
      }));
   }
}

Dao は、以下を継承することにする

import javax.jdo.PersistenceManager;
import com.google.inject.Inject;
/**
 * PersistDao
 */

public abstract class PersistDao{
   @Inject  private PersistenceManager persistenceManager;

   protected PersistenceManager getPersistenceManager(){
      return this.persistenceManager;
   }
}

Paper というエンティティのPersistDaoクラスは、、、

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.jdo.Query;
import org.datanucleus.store.query.AbstractQueryResult;
/**
 * PaperDao
 */

public class PaperDaoImpl extends PersistDao implements PaperDao,Serializable{

   @Override
   public void insert(Paper paper){
      getPersistenceManager().makePersistent(paper);
   }
   @Override
   public void update(Paper paper){
      this.insert(paper);
   }
   @Override
   public Paper select(long id){
      return  getPersistenceManager().getObjectById(Paper.class,id);
   }
   @Override
   public List<Paper> getAll(){
      AbstractQueryResult result 
= (AbstractQueryResult)getPersistenceManager().newQuery(Paper.class).execute();
      List<Paper> list = new ArrayList<Paper>();
      for(Iterator<?> it=result.iterator();it.hasNext();){
         list.add*1;
      }
      return list;
   }
   @Override
   public int count(){
      Query query = getPersistenceManager().newQuery(Paper.class);
      query.setResult("id");
      query.execute();
      return *2.size();
   }
}

*1:Paper)it.next(

*2:AbstractQueryResult)query.execute(