Google App Engine - JDODetachedFieldAccessException - PullRequest
3 голосов
/ 12 августа 2011

Я довольно новичок в JPA / JDO и во всем мире объектной базы данных.

У меня есть сущность с набором строк, похожая на:

@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 ]

5 голосов
/ 13 августа 2011

ОК, поэтому я нашел ответ в каком-то блоге.

Итак, для всех, кому интересно:

Чтобы использовать коллекцию простых типов данных (в JPA), @Basicзапись должна быть добавлена ​​в коллекцию.Так что из моего примера вверху должно было быть написано:

@Basic
private Set<String> bars;
3 голосов
/ 13 августа 2011

То есть вы используете 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, и это разумный выбор, но вам придется немного изменить свои аннотации.

...