Вопрос

Мой вопрос больше относится к рекомендациям о том, как реализовать несвязанные отношения с 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 в вашу модель.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top