2

私の質問は、Google App Engine との所有されていない関係を実装する方法に関するベスト プラクティスの質問です。私はJDOを使用して永続化を行っており、Googleドキュメントで推奨されているように、所有されていない関係のリストを次のように永続化しています:

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class User implements Serializable, UserDetails {
...

    @Persistent
    private List<Key> groups;
...
}

Key オブジェクトを使用してオブジェクトのリストをクエリしようとしたときに、苦境に直面しました。そのため、実際に Group オブジェクトのリストを返すためにグループ キーのリストを取得する場合、そのキーを検索してオブジェクトを取得する必要があります。私の質問は、モデル オブジェクトで所有されていないルックアップを行うための推奨される方法は何ですか?

ルックアップできるように、Model オブジェクトに PersistanceManagerFactory のインスタンスが必要ですか?

検索できるように、Model オブジェクトに GroupDAO オブジェクトのインスタンスを作成する必要がありますか?

このタイプのルックアップを行うためのユーティリティが必要ですか?

私はこれが初めてなので、これを行うための最良の方法を知りたいだけです。ありがとう。

4

2 に答える 2

1

理想的には、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 を使用することができます。

于 2009-08-04T15:39:19.423 に答える
1

シングルトンの PersistenceManagerFactory を作成することをお勧めします。私はあなたのモデルにPMFを貼り付けません。

于 2009-08-03T02:33:47.177 に答える