2017-11-13 16 views
0

나는 데이터 저장소의 수를 최소화하려는 시스템 (누가하지 않을 것인가?), 모든 동안 조상 관계를 사용하는 시스템을 가지고 있습니다. 다음과 같은 간단한 클래스를 고려Objectify - Ref의 순서를 저장 <?> -s

public class Ancestor { 
    @Id 
    private String id; 
    private String field; 
    private Ref<Descendant> descendantRef; 
    public Descendant getDescendant() { 
     return this.descendantRef.get(); 
    } 
    public void setDescendant(Descendant des) { 
     this.descendantRef = Ref.create(des); 
    } 
} 

public class Descendant { 
    @Id 
    private String id; 
    private String field; 
    @Parent 
    private Key parent; 
} 

내 문제 : 나는 조상의 실체를 저장시, 자손 심판을 설정에도 불구하고 null이 저장됩니다,하지만 난뿐만 아니라 후손을 저장하면, 객관화는 Attempted to save a null entity를 뿌려줍니다.

내 질문 : 나는 객관화가 @Load 주석과 get() 작업의 순서를 최적화하는 것을 수집, 그래서 시간 조상이 전송되고 있음을, 그래서 그것은뿐만 아니라 save() 작업에 동일한 작업을 수행 할 수있는 방법이 Datastore에서 Descendant Ref가 제대로 채워 졌습니까?

미리 조언 해 주셔서 감사합니다.

+0

많은 조상을 저장할 때 descendantRef에 대한 save() 연산을 최적화 할 수있는 방법을 묻고 있습니까? – Ajeet

+0

@Ajeet Ancestor에서만 save()를 호출하고 Objectify가로드 그래프와 비슷한 "Save Graph"를 최적화하고 Descendant를 먼저 저장하고 Ref <>를 생성하고 Ancestor를 저장하여 그. 이것은 불가능할 가능성이 큽니다. 그 외에도 descendantRef를 자동으로 생성하는 방법이있는 경우 조상이 참조로 저장 될 때까지 ... –

답변

0

당신은이 같은이 구현 숨길 수 : 이로써

public Descendant getDescendant() { 
    // You probably don't want to break your code on null descendantRef 
    if (this.descendantRef != null) { 
     return this.descendantRef.get(); 
    } 
    return null; 
} 

public void setDescendant(Descendant des) { 
    // Insert if this des have never been insert 
    if (getDescendant() != null) { 
     new DescendantEndpoint().insert(des); 
    } 
    // You probably don't want to break your code on null des 
    if (des != null) { 
     this.descendantRef = Ref.create(des); 
    } 
} 

을, 당신은 당신이 할 것입니다 엔드 포인트 각각에 대한 심판의 각각의 삽입과 거래를 할 필요가 없습니다. 그러나이 방법은 각 개별 데이터 저장소 연결에 삽입되므로 대량 삽입에 최적화되어 있지 않습니다. 이를 위해

당신은 같은 것을 할 수 있습니다

private Object bulkInsertAncestor(ArrayList<Ancestor> list){ 
     ArrayList<Descendant> descendantArrayList = //get descendant list 
     // You should do all this inside a transaction 
     new DescendantEndpoint().bulkInsertDescendant(descendantArrayList); 
     return ofy().save().entities(list); 
    } 
+0

또한 앱 엔진 애플리케이션에 각각의 insert 및 bulkInsert API가 있는지 확인하십시오 엔티티 끝점 – Ajeet

+0

질문이나 의문 사항이 있으면 알려주십시오. 나는 objectify 및 app-engine을 사용하는 응용 프로그램에서 작업 중입니다. 나는 내 방법을 시도하고있다. – Ajeet

0

객관화에만 Attempted to save a null entity 당신이 그대로 저장() 메소드에 null 값을 전달하는 경우 뿌려줍니다.

이것은 운영 명령 관련 문제가 아닙니다. FWIW, Objectify도 기본 데이터 스토어도 모든 종류의 참조 무결성 검사를 제공하지 않습니다. 당신이 먼저 저장하는 것은 중요하지 않습니다.