1

아래에 DAO가 있습니다. 및 단위 당 트랜잭션 삭제가 일괄 처리입니다. 한 번에 하나의 엔티티를 삭제하면 정상적으로 작동합니다.Objectify BATCH 삭제가 아무런 영향을 미치지 않습니다.

일괄 삭제는 아무런 효과가 없습니다 : - 삭제 호출 (Iterable을 keysOrEntities) 객관화 - 아래의 코드는 IMO 단순하고 간단하지만 deleteMyObjects (롱 [] IDS)에 통화가 있습니다 효과 없음!

public class MyObjectDao { 

    private ObjectifyOpts transactional = new ObjectifyOpts().setBeginTransaction(true); 

    private ObjectifyOpts nonTransactional = new ObjectifyOpts().setBeginTransaction(false); 

    private String namespace = null; 

    public MyObjectDao(String namespace) { 
     Preconditions.checkNotNull(namespace, "Namespace cannot be NULL"); 
     this.namespace = namespace; 
    } 

    /** 
    * set namespace and get a non-transactional instance of Objectify 
    * 
    * @return 
    */ 
    protected Objectify nontxn() { 
     NamespaceManager.set(namespace); 
     return ObjectifyService.factory().begin(nonTransactional); 
    } 

    /** 
    * set namespace and get a transactional instance of Objectify 
    * 
    * @return 
    */ 
    protected Objectify txn() { 
     NamespaceManager.set(namespace); 
     Objectify txn = ObjectifyService.factory().begin(transactional); 
     log.log(Level.FINE, "transaction <" + txn.getTxn().getId() + "> started"); 
     return txn; 
    } 

    protected void commit(Objectify txn) { 
     if (txn != null && txn.getTxn().isActive()) { 
      txn.getTxn().commit(); 
      log.log(Level.FINE, "transaction <" + txn.getTxn().getId() + "> committed"); 
     } else { 
      log.log(Level.WARNING, "commit NULL transaction"); 
     } 
    } 

    protected void rollbackIfNeeded(Objectify txn) { 
     if (txn != null && txn.getTxn() != null && txn.getTxn().isActive()) { 
      log.log(Level.WARNING, "transaction <" + txn.getTxn().getId() + "> rolling back"); 
      txn.getTxn().rollback(); 
     } else if (txn == null || txn.getTxn() == null) { 
      log.log(Level.WARNING, "finalizing NULL transaction, not rolling back"); 
     } else if (!txn.getTxn().isActive()) { 
      log.log(Level.FINEST, "transaction <" + txn.getTxn().getId() + "> NOT rolling back"); 
     } 
    } 


    public void deleteMyObject(Long id) { 
     Objectify txn = null; 
     try { 
      txn = txn(); 
      txn.delete(new Key<MyObject>(MyObject.class, id)); 
      commit(txn); 
     } finally { 
      rollbackIfNeeded(txn); 
     } 
    } 

    public void deleteMyObjects(Long[] ids) { 
     Objectify txn = null; 
     List<Key<? extends MyObject>> keys = new ArrayList<Key<? extends MyObject>>(); 
     for (long id : ids) { 
      keys.add(new Key<MyObject>(MyObject.class, id)); 
     } 
     try { 
      txn = txn(); 
      txn.delete(keys); 
      commit(txn); 
     } finally { 
      rollbackIfNeeded(txn); 
     } 
    } 
} 

deleteMyObjects (Long [])를 호출하면 아래 로그에 의심스러운 항목이 없습니다. 트랜잭션은 오류없이 잘 커밋합니다. 그러나 데이터는 영향을받지 않습니다. 동일한 ID 목록을 반복하면서 한 번에 하나씩 개체를 삭제하면 올바르게 작동합니다.

Feb 29, 2012 8:37:42 AM com.test.MyObjectDao txn 
FINE: transaction <6> started 
Feb 29, 2012 8:37:42 AM com.test.MyObjectDao commit 
FINE: transaction <6> committed 
Feb 29, 2012 8:37:42 AM com.test.MyObjectDao rollbackIfNeeded 
FINEST: transaction <6> NOT rolling back 

그러나 데이터는 변경되지 않고 데이터 저장소에 있습니다!?!?!

도움을 환영합니다.

UPDATE

객관화 코드로 스테핑,이 네임 스페이스와 함께 할 수있는 뭔가가 어떠했는지 궁금해? 바로 여기 객관화 코드 : 나는 this.factory.getRawKey (OBJ) 디버그을 검사 할 때

@Override 
public Result<Void> delete(Iterable<?> keysOrEntities) 
{ 
    // We have to be careful here, objs could contain raw Keys or Keys or entity objects or both! 
    List<com.google.appengine.api.datastore.Key> keys = new ArrayList<com.google.appengine.api.datastore.Key>(); 

    for (Object obj: keysOrEntities) 
     keys.add(this.factory.getRawKey(obj)); 

    return new ResultAdapter<Void>(this.ads.delete(this.txn, keys)); 
} 

, 나는 키의 공간이 비어있는 것을 알 수 있습니다. NamespaceManager.get() 그러나 올바른 네임 스페이스를 반환합니다!? 키를 생성 할 때

enter image description here

답변

3

네임 스페이스가 설정되지 않았습니다.

키를 만들기 전에 네임 스페이스를 설정해야합니다!

그래서 다음과 같이 다시 작성, 내 문제 해결 :

new MyObjectDAO("somenamespace").delete({ 1L, 34L, 116L }); 
: 다음

public void deleteMyObjects(Long[] ids) { 
    Objectify txn = null; 
    try { 
     txn = txn(); 
     List<Key<MyObject>> keys = new ArrayList<Key<MyObject>>(); 
     for (long id : ids) { 
      keys.add(new Key<MyObject>(MyObject.class, id)); 
     } 
     txn.delete(keys); 
     commit(txn); 
    } finally { 
     rollbackIfNeeded(txn); 
    } 
} 

을 나는이 전화

관련 문제