2012-03-31 2 views
0

나는 상황이 - 내 EquipmentType 클래스에서 나는부모와 하나 많은 객관화 RequestFactory

List<Key<EquipmentCheckout>> field 

이 질문에 대한 답을 읽은 후 장비 체크 아웃의 목록을 가지고 : Objectify Relationships: One-to-Many, Can I do this efficiently? - 그것은 더 효율적으로 보인다 이 작업을 수행하는 방법은 다음과 같이 보일 것이다라는 클래스 EquipmentCheckouts 만드는 것입니다 : 지금

class EquipmentCheckouts 
    @Id 
    Long id 

    @Parent 
    EquipmentType equipmentType 

    @Indexed 
    List<EquipmentCheckout> equipmentCheckouts 

를 - 여기에 내가 궁금하네요 무엇 - 나는 RequestFactory을 사용하고 있는데 나는 RequestFactory이 발견을 가지고 가지고 있다고 생각합니다 (긴 id) 메소드. 내가 EquipmentType 부모 객체를 EquipmentCheckouts를 검색하기 위해 이해하는 바로는 다음의 라인을 따라 뭔가를해야 할 것 :

Key<EquipmentType> key = ObjectifyService.factory().getKey(equipmentType) 
return ofy.get(new Key<EquipmentCheckouts>(key, EquipmentCheckouts.class, id)) 

을 그래서, 당신은 긴 찾기에 EquipmentType을 (있을 수없는 경우 id) method 어떻게하면됩니까?

다른 모든 시스템의 경우 로그인 한 사용자 세션에 저장된 비즈니스 부모가 있습니다. 그러면 사용자를 인증 한 모든 항목을 검색 한 다음 비즈니스를 키를 입력하여 검색하십시오. Objectify에서 @Parent를 올바르게 사용하는 것에 대해 이해하지 못하는 것처럼 느껴집니다.

+0

가능한 중복 http://stackoverflow.com/questions/9750650/gwt-requestfactory-entity-locator-does-not -work-with-entity-h-entity-h) –

+0

네 말이 맞아. 나는 그걸 검색에서 보지 못했다. 나는이 페이지의 링크를 사용하여 현재 이것을 해결하고있다. http : // nimbustecnologia .logspot.com/2011/01/requestfactory-objectify.html - 고마워요. –

답변

2

부모가있는 엔티티를 지원하는 자신 만의 Locator을 구현해야합니다. 부모의 Key가 없기 때문에 긴 ID를 사용할 수 없습니다. 개체에 대한 전체 경로가 들어있는 복합 문자열 키를 사용하는 Locator를 구현하여이 문제를 해결했습니다.

여기서 중요한 점은 복합 키가 RPC에만 사용된다는 것입니다. 귀하의 사업체는 여전히 긴 ID를 사용하므로 수정할 필요가 없습니다.

public class PojoLocator extends Locator<DatastoreObject, String> 
{ 
    @Override 
    public DatastoreObject find(Class<? extends DatastoreObject> clazz, String id) 
    { 
     Key<DatastoreObject> key = Key.create(id); 
     return ofy.load(key); 
    } 

    @Override 
    public String getId(DatastoreObject domainObject) 
    { 
     if (domainObject.getId() != null) 
     { 
      Key<DatastoreObject> key = ofy.fact().getKey(domainObject); 
      return key.getString(); 
     } else 
      return null; 
    } 
} 

당신은 내 로케이터 here의 전체 버전을 볼 수 있습니다 여기에

는 코드입니다.

0

RequestFactory interface에는 Long 일 필요는 없습니다. 문서가 말하는 것처럼 :

Built-in value types: BigDecimal, BigInteger, Boolean, Byte, Enum, Character, Date,  Double, Float, Integer, Long, Short, String, Void 
Custom value types: any subclass of ValueProxy 
Entity types: any subclass of EntityProxy 
Collections: List<T> or Set<T>, where T is one of the above value or entity types 

을 그래서 당신이 갈망을 가질 수 find(Long, Long)를. 하나는 부모를위한 것이고 다른 하나는 enntity를위한 것입니다.

+0

혼란 스럽네요. 요청 팩토리 로케이터 클래스에서 재정의 된 find 메소드는 Class , Long - find 메서드에는 단 하나의 매개 변수 만 있으므로 find (Long, Long) 구현을 실제로 구현하는 방법은 무엇입니까 ?? –

0

루슬란 대답은 스포트 온입니다. 부모와 함께 엔티티 문제를 해결하고 루트 엔티티에서 계속 작업합니다.

내가 지나가는 사람에게 유용 할 경우를 대비하여 Objectify 4를 사용하여 로케이터 코드의 업데이트 된 버전을 복사합니다.

@Override 
    public EntityObject find(Class<? extends EntityObject> clazz, String id) { 

     Key<EntityObject> key = Key.create(id); 

     EntityObject ob = ofy().load().key(key).now(); 
     return ob; 
    } 


    @Override 
    public String getId(EntityObject domainObject) { 

     if (domainObject.getId() != null) 
     { 
      Key<EntityObject> key = Key.create(domainObject); 
      return key.getString(); 
     } else 
      return null; 
    } 
[엔티티가 ​​긴 ID를 가질 때 객관화 작동하지 않습니다 GWT Requestfactory 엔티티 로케이터 (의