2012-02-29 18 views
1

私は以下のDAOを持っています。エンティティとにつきエンティティごとにトランザクションの削除があります。 一度に1つのエンティティを削除するだけで問題ありません。Objectify BATCH削除は無効です

一括削除はまったく効果がありません: - 削除を呼び出します(反復処理可能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リストをループしてオブジェクトを一度に1つずつ削除するだけでうまくいきます。

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

キーを作成するときに名前空間が設定されませんでした。

キーを作成する前に名前空間を設定する必要があります。したがって、このようにそれを書き換える

は、私の問題を修正:

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); 
    } 
} 

は、その後、私はこれを呼び出す:

new MyObjectDAO("somenamespace").delete({ 1L, 34L, 116L }); 
関連する問題