JPA Google App Engine получает com.google.appengine.datanucleus.EntityUtils$ChildWithoutParentException
Обновление: я обнаружил, что проблема в моем случае заключается в том, что я сам генерирую первичный ключ FbUser, используя метод keyfactory.createKey(). Если я поменяю его на авто генерацию, он будет работать нормально. Но проблема в том, что я не хочу, потому что мои данные в формате строки для ключа. Поэтому мне нужно вручную изменить тип с String на Key и затем сохранить его.
Я использую Google 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)
Есть идеи, почему это происходит? Ps HRD уже включен.
1 ответ
Таким образом, вы сохранили FbUser без родительской сущности, а затем попытаетесь изменить его позднее, а GAE Datastore этого не позволяет (как довольно ясно сказано в сообщении). Вы не предоставляете код персистентности, поэтому никакой комментарий невозможен, кроме догадок.
Решение: сохраните его правильно (сначала родитель, затем ребенок), или сохраните их как Unowned.