سؤال

وسؤالي هو أكثر من أفضل الممارسات السؤال حول كيفية تنفيذ العلاقات مفلس مع محرك تطبيقات جوجل. أنا أستخدم JDO ان اؤدي المثابرة وأحب الموصى بها في مستندات جوجل أنا استمرار قائمتي العلاقات مفلس مثل ذلك:

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

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

والآن جئت عبر بلدي مأزق عندما ذهبت للاستعلام تلك القائمة من الكائنات باستخدام أنها كائن مفتاح. لذلك عندما أحصل على قائمتي مفاتيح مجموعة من أجل العودة في الواقع قائمة الكائنات المجموعة يجب أن أقوم به نظرة حتى على هذا المفتاح للحصول على وجوه. سؤالي هو ما هي الطريقة الموصى بها للقيام نظرة مفلس حتى على كائن النموذج؟

وإذا ما لدي مثيل PersistanceManagerFactory على بلدي كائن نموذج حتى أتمكن من القيام البحث؟

وإذا ما لدي مثيل بلدي الكائن GroupDAO على بلدي كائن نموذج لذلك أستطيع أن أفعل نظرة يصل؟

وإذا ما لدي المساعدة على القيام بهذا النوع من البحث؟

وأنا جديدة على هذا لذلك أريد فقط أن تعرف ما هو أفضل طريقة للقيام بذلك. شكرا.

هل كانت مفيدة؟

المحلول

ومن الناحية المثالية، الكائن User سيكون له أسلوب بإرجاع List<UnownedObject> بحيث المتصلين الحصول على API نظيفة. طريقة واحدة للقيام بذلك هي لكائن User أن يكون لها مثيل من DAO لذلك يمكن أن يطلب من DAO للقيام الاستعلام.

في أجل القيام بذلك، PersistenceManager لا يمكن أن تكون مغلقة حتى نهاية الطلب. إحدى الطرق للقيام بذلك هي لإنشاء مرشح بريمج :

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 .

وهذا هو واحد فقط طريقة ممكنة للقيام بذلك. هل يمكن أن يكون أكثر ذكاء كان لديهم providePersistenceManager خلق PersistenceManager وتخزينها كما يعزو طلب بدلا من وجود مرشح بريمج خلق PersistenceManager (ان مرشح يزال إغلاقه). هل يمكن أن يكون أيضا مرشح بريمج الحصول على Guice الحاقن حتى تتمكن من تجنب استخدام setAttribute() وgetAttribute() وبدلا من استخدام أكثر من نوع API آمن.

نصائح أخرى

توصي خلق المفرد PersistenceManagerFactory. وأود أن لا عصا PMF في النموذج الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top