2011-08-12 22 views
3

私はJPA/JDOとobjectdbの世界全体でかなり新しいです。Google App Engine - JDODetachedFieldAccessException

私は文字列の集合を持つエンティティを持っているが、ビットのようになります。

EntityManager em = EMF.get().createEntityManager(); 
Foo myFoo = em.find(Foo.class, fooKey); 
em.getTransaction().begin(); 
myFoo.addBar(newBar); 
em.merge(myFoo); 
em.getTransaction().commit(); 
:今

@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); 
    } 

} 

、コードの別の部分で、私はこのような何かをしようとしています

もちろん、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クラスのメタデータに関するエラーを得ましたこれを簡単な英語で説明します。

答えて

5

OK、 私はいくつかのブログで答えを見つけました。興味を持っている人にとってそう

(JPAで)単純なデータ型のコレクションを使用するためには、 @Basic 表記がコレクションに追加されなければなりません。だから上の私の例から、それは書かれているはずです:

@Basic 
private Set<String> bars; 
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用に設定されていますが、これは合理的な選択ですが、少し注釈を変更する必要があります。

+0

ありがとう、私は本当にそれらの2つが混ざっている。 私はJPAを書いていることを知っていましたが、JDOの例外があるので、日食がバックグラウンドで行われた可能性があると思いました。 私もjpaのGoogle Appengineチュートリアルを読んだが、それは役に立たなかった。彼らはあまりにも多くの表記について書いていません。そしてそこのリンクのいくつかは壊れています。とにかく、JPAで書いていたときになぜJDOの例外があるのか​​を調べるべきだと私は思っていました。そして結局答えを見つけたので、ありがとう! –