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 같이 예외가 발생하지 않습니다. 필드 값)
datanucleus-api-jdo와 jdo-api는 Unowned와는 아무런 관련이 없습니다. Unowned는 GAE 전용 개념입니다. 분명히 JDO 스펙은 그 시간에 어떤 필드가 가져 오기 계획에있는 것만로드 할 것이고 시간을 가져 오는 방법과 그 라이프 사이클 상태를 나타내는 코드를 제시하지 않습니다. – DataNucleus
gwt 요청을 사용하고 있습니까? 공장 또는 gwt rpc? 요청 팩토리를 사용하는 경우 .with ("color")를 요청 컨텍스트에 추가하면 오브젝트에서 getColor가 호출됩니다. 나는 특히 이런 이유로 requestfactory를 사용했다. –