3

我对 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 类元数据的错误(我不太明白它的含义。)

我真的很感激在这件事上的一些帮助,甚至是对解释这个的人的一个很好的参考(用简单的英语)。

4

2 回答 2

5

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

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

为了使用简单数据类型的集合(在 JPA 中),应将 @Basic 表示法添加到集合中。所以从我在顶部的例子中,它应该是这样写的:

@Basic
private Set<String> bars;
于 2011-08-13T19:56:33.427 回答
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 配置的,这是一个合理的选择,但是您必须稍微更改一下注释。

于 2011-08-13T05:50:49.437 回答