Google App Engine - JDODetachedFieldAccessException
Я довольно новичок в JPA/JDO и во всем мире objectdb.
У меня есть объект с набором строк, выглядит примерно так:
@Entity
public class Foo{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Key id;
private Set<String> bars;
public void setBars(Set<String> newBars){
if(this.bars == null)
this.bars = new HashSet<String>;
this.bars = newBars;
}
public Set<String> getBars(){
return this.bars;
}
public void addBar(String bar){
if(this.bars == null)
this.bars = new HashSet<String>;
this.bars.add(bar);
}
}
Теперь, в другой части кода, я пытаюсь сделать что-то вроде этого:
EntityManager em = EMF.get().createEntityManager();
Foo myFoo = em.find(Foo.class, fooKey);
em.getTransaction().begin();
myFoo.addBar(newBar);
em.merge(myFoo);
em.getTransaction().commit();
Когда, конечно, newBar является строкой.
Но то, что я получаю, это:
javax.jdo.JDODetachedFieldAccessException: You have just attempted to access field "bars" yet this field was not detached when you detached the object. Either dont access this field, or detach it when detaching the object.
Я искал ответ, но не смог найти.
Я видел, как кто-то спросил о наборе строк, и ему сказали добавить нотацию @ElementCollection.
Я попробовал это, но я получил ошибку о метаданных класса String (я действительно не понимаю, что это означает.)
Я был бы очень признателен за помощь в этом вопросе, даже за хорошее упоминание того, кто это объясняет (простым английским языком).
2 ответа
Итак, я нашел ответ в каком-то блоге.
Так что для тех, кто заинтересован:
Чтобы использовать коллекцию простых типов данных (в JPA), в коллекцию необходимо добавить нотацию @Basic. Так что из моего примера вверху должно было быть написано:
@Basic
private Set<String> bars;
Итак, вы используете JPA, верно? (Я вижу EntityManager, а не PersistenceManager JDO.) Поскольку вы получаете ошибку JDO, я подозреваю, что ваше приложение не настроено должным образом для JPA.
Документы JPA: http://code.google.com/appengine/docs/java/datastore/jpa/overview.html
Документы JDO: http://code.google.com/appengine/docs/java/datastore/jdo/overview.html
Вам нужно выбрать одну оболочку хранилища данных и придерживаться ее. Новое приложение по умолчанию с инструментами Eclipse настроено для JDO, и это разумный выбор, но вам придется немного изменить свои аннотации.