Обновление: Я выяснил, что проблема в моем случае заключается в том, что я сам генерирую первичный ключ 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 уже включен.
Я сохранил родителя. Я могу сохранить все это, используя механизм приложения для автоматического создания ключей. Но когда дело доходит до того, что я назначаю ключ как строку, а затем преобразую его в Key с помощью метода Keyfactory.createKey, тогда он выдает указанную выше ошибку. Поэтому я просто оставил его так, как есть, и пошел с использованием автоматического создания ключей, хотя это, возможно, не было лучшим вариантом для меня в соответствии с кодом, который у нас уже был. – Sara