تنفيذ علاقة مفلس محرك تطبيقات جوجل
-
10-07-2019 - |
سؤال
وسؤالي هو أكثر من أفضل الممارسات السؤال حول كيفية تنفيذ العلاقات مفلس مع محرك تطبيقات جوجل. أنا أستخدم 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 في النموذج الخاص بك.