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 が 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クラスのMetadataでエラーが出ました(意味がよくわかりません。)

これについて誰かが(簡単な英語で)説明しているのを参考にしていただければ幸いです。

4

2 に答える 2

5

OK、ブログで答えを見つけました。

だから、興味のある人のために:

単純なデータ型のコレクションを (JPA で) 使用するには、コレクションに @Basic 表記を追加する必要があります。ですから、上の私の例から、次のように書かれているはずです:

@Basic
private Set<String> bars;
于 2011-08-13T19:56:33.427 に答える
3

JPAを使用していますよね?(JDO の PersistenceManager ではなく EntityManager が表示されます。) 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

1 つのデータストア ラッパーを選択して、それに固執する必要があります。Eclipse ツールを使用したデフォルトの新しいアプリは JDO 用に構成されており、これを選択するのは妥当ですが、注釈を少し変更する必要があります。

于 2011-08-13T05:50:49.437 に答える