2013-02-26 2 views
2

GAE (1.7.4) + GWT (2.5.0) 응용 프로그램이 로컬 Jetty (개발 서버)에서 실행되며 JDO를 사용하여 매우 간단하고 고전적인 설정을 가지고 있다고 가정 해 보겠습니다. 지속성을 위해.JDO on GAE - @Unowned fields null로 반환 됨

Person 및 Color라는 두 개의 @PersistenceCapable 클래스가 있다고 가정 해 보겠습니다. 모든 사람은 정확히 하나의 좋아하는 색을 가지고 있지만이 사람이이 색을 소유한다는 것을 의미하지는 않습니다 - 많은 다른 사람이 같은 즐겨 찾는 색을 가질 수 있습니다. 제한된 수의 유명한 색상이 있으며 누구도 좋아하지 않더라도 색상이 존재할 수 있습니다.

@PersistenceCapable 
public class Color { // just the most regular Entity class 

    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Key key; 

    @Persistent 
    String rgb; 

    // getter, setter, no constructor 
} 

@PersistenceCapable 
public class Person { 

    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Key key; 

    @Persistent 
    String surname; 

    @Persistent 
    @Unowned // here is the tricky part 
    Color color; 

    // getters, setters, no constructor 
} 

을 몇 가지 간단한, 잘 알려진, PersistentManager 기반 코드와 I를 성공적으로 만들 수이고 지속 : 만약 내가 잘못 나 수정하시기 바랍니다 -

내가 @Unowned 관계를 사용해야하는이 모델에 Color 클래스의 인스턴스 GAE 개발 콘솔 -> 데이터 저장소 뷰어에서 생성 된 키와 ID/이름 (13), 그리고 할당 된 RGB를 보았습니다.

매우 비슷한 코드를 사용하여 (다른 요청에서) Person 클래스의 인스턴스를 만들 수 있고, 기존 색상을 좋아하는 색상으로 지정할 수 있습니다 (사전에 존재했으며 pm.getObjectById()) 그것을 지속하십시오. 내 좋은 생성 된 키 및 ID/이름 (15) 및 내 할당 된 성 및 color_key_OID (13) 데이터 저장소 뷰어에서 볼 수 있습니다. 이것은 매우 유망 해 보입니다.

하지만 DB (간단한 pm.getObjectById(), 트랜잭션 없음)에서 Person (15)을 반입하면 올바르게 할당 된 성이 있지만 Color (13) 대신 null이 있습니다! 데이터 저장소 뷰어에서 문제가 없지만 코드는 그렇지 않습니다.

아, 문제 코드? "Person p = pm.getObjectById (Person.class, key);"

(사이드 노트 : @Unowned 콜렉션 (데이터 스토어 뷰어의 멋진 값 목록이지만 내 코드의 null 콜렉션 필드)에도 동일한 문제가 있습니다. classpath에있는 JDO jars는 "datanucleus-api-jdo- 3.1.1.jar "및"jdo-api-3.0.1.jar "그래서 그들은 @Unowned 지원합니다 가정합니다 .- @ Unowned 필드와 아무런 문제가 있습니다. 난 영원한 또는 인출, 그냥 일반 nulls 같이 예외가 발생하지 않습니다. 필드 값)

+1

datanucleus-api-jdo와 jdo-api는 Unowned와는 아무런 관련이 없습니다. Unowned는 GAE 전용 개념입니다. 분명히 JDO 스펙은 그 시간에 어떤 필드가 가져 오기 계획에있는 것만로드 할 것이고 시간을 가져 오는 방법과 그 라이프 사이클 상태를 나타내는 코드를 제시하지 않습니다. – DataNucleus

+0

gwt 요청을 사용하고 있습니까? 공장 또는 gwt rpc? 요청 팩토리를 사용하는 경우 .with ("color")를 요청 컨텍스트에 추가하면 오브젝트에서 getColor가 호출됩니다. 나는 특히 이런 이유로 requestfactory를 사용했다. –

답변

0

나는 당신이 설명한 것과 동일한 이슈를 가지고있다. DataNucleus는 오브젝트의 전체 라이프 사이클을 설명해야한다고 말했습니다. 필자의 경우 close() 함수로 PersistenceManager를 닫기 전에 person 객체에서 색상을 가져와야하는 문제가 해결되었습니다.

JDO는 객체를 가져 오기 위해 지연로드 기술을 사용합니다. 인출 할 그룹을 지정하여 필요한 경우

@FetchGroup(name="eager", members={@Persistent(name="color")}) 
@PersistenceCapable 
public class Person { 

및 사용 :

3

중 하나는

@Persistent(defaultFetchGroup="true") 
@Unowned 
Color color 

"eagerly 페치"수 또는 다음과 같이 자신의 fetchgroup를 정의하는 색상을 표시

PersistenceManager pm = pmf.getPersistenceManager(); 
pm.getFetchPlan().addGroup("eager"); 
+0

열심히 가져온 나를 위해 마술 않았다. 고마워요 skirsch! – LuxuryMaster

0

나는 나의 @Unowned Lists 중 하나에서 같은 문제에 직면했다. 배열이 완벽하게 반입되는 다른 두 개가 더 있습니다.

나를 위해이 문제를 해결 한 이유는 더 큰 속성의 이름을 변경하는 것이 었습니다. 귀하의 경우에는 속성 이름을 "color"에서 "myfavoritecolor"와 같은 더 큰 것으로 변경하는 것과 같습니다.

0

페치 그룹을 쿼리에 추가하고 영구적 인 관리자를 추가하지 않아도이 문제를 해결할 수있었습니다.

PersistenceManager pm = PMF.get().getPersistenceManager(); 
    logger.info("EVENTS FETCH GROUPS : " + pm.getFetchPlan().getGroups()); 
    /*pm.getFetchPlan().addGroup("eventFetchGroup"); 
    pm.getFetchPlan().setMaxFetchDepth(2);*/ 
    Query q = pm.newQuery(Event.class); 
    q.getFetchPlan().addGroup("eventFetchGroup"); 
    logger.info("EVENTS FETCH GROUPS : " +q.getFetchPlan().getGroups()); 
    q.setFilter("date >= fromDate && date <= toDate"); 
    q.declareParameters("java.util.Date fromDate, java.util.Date toDate");