В идеале, у объекта 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");
}
}
Наконец, вам нужно настроить Google App Engine для использования Guice .
Это всего лишь один из возможных способов сделать это. Вы могли бы быть более умным, если бы providePersistenceManager
создали PersistenceManager
и сохранили его в качестве атрибута запроса вместо того, чтобы фильтр сервлета создал PersistenceManager
(фильтр все равно закроет его). Вы также можете использовать фильтр сервлетов для получения Guice Injector, чтобы вы могли избегать использования setAttribute()
и getAttribute()
и вместо этого использовать более безопасный для типов API.