JDO Google App Engine проверяет пользователя

Я следил за учебным пособием по движку приложений Google, и часть, объясняющая JDO, выполняется на основе гостевой книги. Поэтому, когда они запрашивают постоянство (я полагаю, BigTable), они заинтересованы в возврате всех результатов.

Я пытаюсь адаптировать это для отображения результатов для конкретного пользователя, но, похоже, у меня проблемы с этим.

UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();
if(user != null) {
    PersistenceManager pm = PerManFac.get().getPersistenceManager();
    String query = "select * from " + Team.class.getName();
    List<Team> teamList = (List<Team>) pm.newQuery(query).execute();
    if(teamList.isEmpty()) {

Это часть того, что у меня есть до сих пор, мне нужно адаптировать строку запроса, чтобы она была «где пользователь = пользователь», но каждый раз у меня возникают проблемы.

Объект My Team содержит только ключ, пользователя, строку и дату.


person AphexMunky    schedule 12.09.2010    source источник


Ответы (1)


Вы можете сделать это без JDOQL. Если у пользователя только одна команда, вы можете смоделировать это с помощью владел отношением "один ко многим", которое является двунаправленным.

@PersistenceCapable
public class Team {
  @Persistent(mappedBy = "team")
  private List<Employee> employees;
}

@PersistenceCapable
public class Employee {
  @PrimaryKey
  private String user;

  @Persistent
  private Team team;
}

Чтобы получить Employee, вы можете отправить запрос по электронной почте:

UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();

PersistenceManager pm = PMF.get().getPersistenceManager();
Employee employee = pm.getObjectById(Employee.class, user.getEmail());
Team employee.getTeam();

Если пользователь может состоять в нескольких командах, необходимо использовать бесхозные отношения. Судя по вашему описанию, у каждой команды есть один пользователь (?), поэтому вам может понадобиться бесхозное отношение «многие ко многим».

Часть, которая не очень хорошо документирована, заключается в том, что вы не можете использовать объект User в качестве первичного ключа (возможные типы для первичного ключа достаточно ограничены), поэтому вы часто используете электронную почту в качестве первичного ключа. Объект User может быть полем, но чтобы ваша модель данных была согласованной, вы часто либо везде используете адрес электронной почты для ссылки на пользователя, либо используете объект-оболочку, как я сделал выше.

person NamshubWriter    schedule 12.09.2010
comment
я получаю сообщение об ошибке, используя ваш метод: Преобразование исключения [email protected] во внутренний ключ. Я думаю, что это может быть откуда-то еще в моем коде, но у меня проблемы с поиском его источника. - person AphexMunky; 12.09.2010
comment
Извините, только что увидел ваше редактирование, что вы не можете использовать пользователя в качестве первичного ключа. - person AphexMunky; 12.09.2010
comment
Пожалуйста, поправьте меня, если я ошибаюсь, но не лучше ли использовать user.getUserId() в качестве первичного ключа?code.google.com/appengine/docs/java/javadoc/com/google/ - person Chilloutman; 31.12.2010
comment
Похоже, User.getUserId() был бы хорошим выбором, но я никогда не пробовал. Если у вас есть, и это сработало, я обновлю ответ - person NamshubWriter; 03.01.2011