2011-08-12 5 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

당신은 하나의 데이터 저장소 래퍼를 선택하고 그것에 충실해야합니다. 이클립스 도구를 사용하는 기본 새 앱은 JDO 용으로 구성되어 있으므로 합리적인 선택이지만 주석을 약간 변경해야합니다.

+0

감사합니다. JPA를 쓰고 있다는 것을 알았지 만 JDO 예외가 생겨서 Eclipse가 백그라운드에서 수행했을 수도있는 일이라고 생각했습니다. 또한 jpa에서 Google App Engine 튜토리얼을 읽었지만 도움이되지 않았습니다. 그들은 표기법에 관하여 너무 많이 쓰지 않습니다. 그리고 거기에있는 링크 중 일부가 고장났습니다. 어쨌든 당신의 회신은 내가 JPA에서 글쓰기를 할 때 JDO 예외가있는 이유를 찾아야한다고 생각하게 만들었습니다. 그리고 마침내 대답을 찾았습니다. 정말 감사합니다! –