0

Обновление: Я выяснил, что проблема в моем случае заключается в том, что я сам генерирую первичный ключ FbUser, используя метод keyfactory.createKey(). Если я изменю его на автоматическое создание, он отлично работает. Но проблема в том, что я не хочу, потому что мои данные в формате String для ключа. Поэтому мне нужно вручную изменить тип из String в Key, а затем сохранить его.

Я использую JPA App Engine JPA и пытаюсь установить отношения oneToMany среди моих сущностей.

@Entity 
public class DummyParent{ 


@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private long id; 

//@Unowned 
@OneToMany(targetEntity=FbUser.class, mappedBy="dummyP", fetch=FetchType.LAZY, cascade = CascadeType.ALL) 
private ArrayList<FbUser> users; 
} 

И здесь FbUser как ребенок:

@Entity 
public class FbUser { 

@Id 
private Key id; 
private String name; 
@ManyToOne(fetch=FetchType.LAZY) 
private DummyParent dummyP; 
} 

Так после этого я создаю экземпляр родительского класса установите его идентификатор и набор пользователей. Но я получаю следующее исключение:

Caused by: com.google.appengine.datanucleus.EntityUtils$ChildWithoutParentException: Detected attempt to establish DummyParent(no-id-yet) as the parent of FbUser("1322222") but the entity identified by FbUser("1322222") has already been persisted without a parent. A parent cannot be established or changed once an object has been persisted. 
at com.google.appengine.datanucleus.EntityUtils.extractChildKey(EntityUtils.java:939) 
at com.google.appengine.datanucleus.StoreFieldManager.getDatastoreObjectForCollection(StoreFieldManager.java:967) 
at com.google.appengine.datanucleus.StoreFieldManager.storeFieldInEntity(StoreFieldManager.java:394) 

Любая идея, почему это происходит? P.s. HRD уже включен.

ответ

2

Таким образом, вы сохраняли FbUser без родительского объекта, а затем пытаетесь изменить его позднее, а хранилище данных GAE не допускает этого (поскольку сообщение говорит довольно четко). Вы не указываете код персистентности, поэтому комментарии не возможны, кроме догадок.

Решение: сохраняйте его правильно (родительский, затем ребенок), или сохраняйте их как Unowned.

+0

Я сохранил родителя. Я могу сохранить все это, используя механизм приложения для автоматического создания ключей. Но когда дело доходит до того, что я назначаю ключ как строку, а затем преобразую его в Key с помощью метода Keyfactory.createKey, тогда он выдает указанную выше ошибку. Поэтому я просто оставил его так, как есть, и пошел с использованием автоматического создания ключей, хотя это, возможно, не было лучшим вариантом для меня в соответствии с кодом, который у нас уже был. – Sara