Google App Engine - JDODetachedFieldAccessException

时间:2011-08-12 14:07:18

标签: google-app-engine jpa jdo objectdb

我对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是一个String。

但是,我得到的是:

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 个答案:

答案 0 :(得分:5)

行, 所以我在一些博客中找到了答案。

所以对于任何有兴趣的人:

为了使用简单数据类型的集合(在JPA中),a     @basic 应该将符号添加到集合中。所以从我在顶部的例子来看,它应该写成:

@Basic
private Set<String> bars;

答案 1 :(得分:3)

所以你正在使用JPA,对吗? (我看到的是EntityManager而不是JDO的PersistenceManager。)由于您收到了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配置的,这是一个合理的选择,但您必须稍微更改注释。