Реализация неизвестных отношений Google App Engine
-
10-07-2019 - |
Вопрос
Мой вопрос больше относится к рекомендациям о том, как реализовать несвязанные отношения с Google App Engine. Я использую JDO для своей настойчивости и, как рекомендовано в документах Google, я сохраняю свой список неподтвержденных отношений, например:
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class User implements Serializable, UserDetails {
...
@Persistent
private List<Key> groups;
...
}
Теперь я столкнулся с моим затруднительным положением, когда пошел запрашивать этот список объектов, используя их объект Key. Поэтому, когда я получаю свой список ключей группы, чтобы на самом деле вернуть список объектов группы, мне нужно найти этот ключ, чтобы получить объект. Мой вопрос заключается в том, каков рекомендуемый способ поиска объекта модели без использования?
Должен ли я иметь экземпляр объекта PersistanceManagerFactory в моем объекте Model, чтобы я мог выполнить поиск?
Должен ли я иметь экземпляр моего объекта GroupDAO в моем объекте Model, чтобы я мог выполнить поиск?
Должен ли я использовать утилиту для этого типа поиска?
Я новичок в этом, поэтому я просто хочу знать, какой это лучший способ сделать это. Спасибо.
Решение
В идеале, у объекта User
должен быть метод, который возвращает List<UnownedObject>
, чтобы вызывающие абоненты получали чистый API. Один из способов сделать это состоит в том, чтобы у объекта PersistenceManager
был экземпляр DAO, чтобы он мог попросить DAO выполнить запрос.
Для этого UserDao
нельзя закрыть до конца запроса. Один из способов сделать это - создать фильтр сервлетов :
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();
}
}
}
Затем вы можете ввести User.setUserDao()
в свой 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;
}
}
Это лучше всего работает, когда providePersistenceManager
находится в том же пакете, что и setAttribute()
, поэтому getAttribute()
может быть областью действия пакета. Вы можете решить установить <=> в объект <=> вместо <=>.
Далее вам нужно создать модуль Guice для привязки <=>:
public class PersistenceManagerModule extends AbstractModule {
@Override
protected void configure() {
}
@Provides @RequestScoped
PersistenceManager providePersistenceManager(HttpServletRequest request) {
return (PersistenceManager) request.getAttribute("pm");
}
}
Наконец, вам нужно настроить Google App Engine на использование Guice . р>
Это только один из возможных способов сделать это. Вы могли бы быть более умным, если бы <=> создали <=> и сохранили его в качестве атрибута запроса вместо того, чтобы фильтр сервлета создал <=> (фильтр все равно закроет его). Вы также можете использовать фильтр сервлетов для получения Guice Injector, чтобы вы могли избежать использования <=> и <=> и вместо этого использовать более безопасный для типов API.
Другие советы
Google рекомендует создать одиночный PersistenceManagerFactory. Я бы не вставил PMF в вашу модель.