2013-04-30 2 views
2

일반적인 Person-Address 엔터티 관계가 있습니다. Person에 대한 데이터 저장소를 쿼리 한 후 Person의 키 주소를 쿼리합니다. 키 (즉, addrKey, 아래 참조)는 항상 null로 반환됩니다. 하지만 데이터 저장소를 살펴보면 키와 함께 Person 및 Address 엔티티를 볼 수 있습니다. 이렇게 명확하게 선 Key addrKey = (Key) person.getProperty("address")는 나가 생각해야하는 무슨을하고 있지 않다. 어떤 아이디어가 이것을 고치는 방법?하위 데이터 저장소 엔터티의 키가 null로 반환됩니다.

DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); 
    Map<Key, Entity> entities = datastore.get(keys); 

    List<Person> result = new ArrayList<Person>(); 
    Iterator<Entry<Key, Entity>> it = entities.entrySet().iterator(); 
    while (it.hasNext()) { 
     Map.Entry<Key, Entity> ent = it.next(); 

     final Entity person = ent.getValue(); 
     Key key = person.getKey(); 
     name = (Long) person.getProperty("name"); 
     Address address = getAddress(datastore, person); 

... 
    } 


private Address getAddress(DatastoreService datastore, Entity person) { 
    Key addrKey = (Key) person.getProperty("address"); 
    try { 
     Entity d = datastore.get(addrKey); 
     String street = (String) d.getProperty("street"); 
… 
} 

답변

0

내 생각에 당신은 주소와 사람을 동시에 유지했습니다. 그러나 주소는 기본적으로 불완전한 키가 있습니다 (키에 대한 자동 ID 생성에 의존한다고 가정). 따라서 불완전한 키를 직접 저장했습니다. 불완전한 키를 사용하는 가져 오기는 작동하지 않습니다.

나는 빠른 테스트 케이스 쓴 :

import com.google.appengine.api.datastore.DatastoreService; 
import com.google.appengine.api.datastore.DatastoreServiceFactory; 
import com.google.appengine.api.datastore.Entity; 
import com.google.appengine.api.datastore.Key; 

public class TempTest extends PersistenceTestHelper { 

    @Test 
    public void testStackOverflow() throws Exception { 

    Entity address = new Entity("address", 1); 
    address.setProperty("street", "my street"); 

    Entity person = new Entity("person", 1); 
    person.setProperty("addressKey", address.getKey()); 
    System.out.println(person); 

    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); 
    datastore.put(person); 
    datastore.put(address); 

    Entity personFromDatastore = datastore.get(person.getKey()); 
    Key addressKey = (Key) personFromDatastore.getProperty("addressKey"); 
    Entity addressFromDatastore = datastore.get(addressKey); 
    System.out.println("fetched street: " + addressFromDatastore.getProperty("street")); 

    address = new Entity("address"); 
    System.out.println("Address with incomplete key: " + address.getKey()); 
    try { 
     addressFromDatastore = datastore.get(address.getKey()); 
    } catch (IllegalArgumentException e) { 
     System.out.println(e); 
    } 
    } 

} 

을 그리고 이것은 출력 : 내가 틀렸다 경우

<Entity [person(1)]: 
    addressKey = address(1) 
> 
fetched street: my street 
Address with incomplete key: address(no-id-yet) 
java.lang.IllegalArgumentException: address(no-id-yet) is incomplete. 

것은, 당신이 시도 캐치를 왜 이해하는 것이 좋을 것이다 당신의보기에서. 또한 미리 입력 된 시간과 pos-get 시간에 Person 엔티티와 Address 엔티티를 출력하는 것이 좋습니다.

+0

나는 또한이 - 이드 - 아직 문제가 있었다. 하지만 나는 그 사람을 데이터베이스에 넣은 다음 주소 엔티티를 작성하고 데이터베이스에서 person 엔티티 특성을 최근에 작성된 주소 엔티티의 키로 갱신했다. 그러나 트랜잭션에서 사람과 주소 엔티티가 모두 필요한 경우 어떻게해야합니까? 마찬가지로 엔티티 엔티티가 동시에 추가되지 않으면 사람 엔티티를 추가 (커미트) 할 수 없습니까? 너는 어떻게 생각하니? – kerafill

관련 문제