Реализация неизвестных отношений Google App Engine - PullRequest
2 голосов
/ 03 августа 2009

Мой вопрос больше относится к рекомендациям о том, как реализовать несвязанные отношения с Google App Engine. Я использую JDO для своей настойчивости и, как рекомендовано в Google Документах, я сохраняю свой список неподтвержденных отношений, например:

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

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

Теперь я столкнулся с моим затруднительным положением, когда пошел запрашивать этот список объектов, используя их ключевой объект. Поэтому, когда я получаю свой список ключей группы, чтобы на самом деле вернуть список объектов группы, мне нужно найти этот ключ, чтобы получить объект. Мой вопрос заключается в том, каков рекомендуемый способ поиска объекта модели без объявления?

Должен ли я иметь экземпляр PersistanceManagerFactory в моем объекте Model, чтобы я мог выполнить поиск?

Должен ли я иметь экземпляр моего объекта GroupDAO на моем объекте Model, чтобы я мог выполнить поиск?

Должен ли я использовать утилиту для этого типа поиска?

Я новичок в этом, поэтому я просто хочу знать, какой лучший способ сделать это. Спасибо.

Ответы [ 2 ]

1 голос
/ 04 августа 2009

В идеале, у объекта 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.

1 голос
/ 03 августа 2009

Google рекомендует создать одноэтапный PersistenceManagerFactory. Я бы не вставил PMF в вашу модель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...