Как смоделировать систему друзей со слоем постоянства? - PullRequest
2 голосов
/ 21 апреля 2009

Привет, я пробую новую поддержку Java для движка приложений Google и пытаюсь создать слой постоянства для всех моих объектов. Я пытаюсь смоделировать соединение с другом, но сталкиваюсь с проблемами. Я использую JPA для сохранения объектов и определения своих объектов постоянства с помощью аннотаций JPA.

Моя идея заключалась в следующем:

Пользовательский объект:

@Entity
public class User  {

@Column(name="user_id")
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true") 
private String id;

@OneToMany(cascade={CascadeType.ALL},mappedBy="invitee")
private List<Connection> IncConnections;

@OneToMany(cascade={CascadeType.ALL},mappedBy="initiator")
private List<Connection> OutConnections;
}

.

@Entity
public class Connection {

@Column(name="connection_id")
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true") 
private String id;

@ManyToOne(cascade={CascadeType.ALL})
User initiator;

@ManyToOne(cascade={CascadeType.ALL})
User invitee;
}

Но когда я пытаюсь это сделать, я получаю ошибку: App Engine ORM не поддерживает несколько полей поставщика родительского ключа

Так у кого-нибудь есть другая идея, как смоделировать систему друга без использования нескольких родительских ключей?

Надеюсь, кто-то может помочь!

Ответы [ 3 ]

2 голосов
/ 21 апреля 2009

В общем, вам придется поддерживать любые отношения самостоятельно с GAE. Лучшие инструменты, которые GAE предоставляет для этого, описаны в их разделе Неизвестные отношения . В частности, я считаю, что раздел, посвященный отношениям «многие ко многим», является актуальным.

Из примеров видно, что вам по-прежнему приходится выполнять большую часть работы по поддержанию ссылочной целостности самостоятельно. Поскольку они, вероятно, находятся в отдельных группах сущностей, вам, вероятно, также потребуется иметь значительный объем кода для работы с потенциально нарушенными отношениями.

2 голосов
/ 24 января 2011
Using Objectify

class User { 
   @Id Long userId; 
   String email; 
} 

class UserFriendMap { 
   @Id Long id; 
   @Parent OKey<User> parent; 
   Set<OKey<User>> friend; // 5000 max
} 
1 голос
/ 21 апреля 2009

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

Таким образом, при использовании движка приложения вам нужно по-другому думать о постоянстве.

Из документации:

Следующие функции интерфейса JPA не поддерживаются реализацией App Engine:

  • Принадлежал отношениям «многие ко многим» и отношениям, не принадлежащим. Вы можете реализовать несобственные отношения, используя явные значения Key, хотя проверка типа в API не применяется.
  • Запросы на присоединение. Вы не можете использовать поле дочерней сущности в фильтре при выполнении запроса к родительскому виду. Обратите внимание, что вы можете проверить поле отношения родителя непосредственно в запросе, используя ключ.
  • Агрегация запросов (группировка по, имеющая, сумма, avg, max, min)
  • Полиморфные запросы. Вы не можете выполнить запрос класса, чтобы получить экземпляры подкласса. Каждый класс представлен отдельным видом сущности в хранилище данных.

http://code.google.com/appengine/docs/java/datastore/usingjpa.html

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