아래에 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() 그러나 올바른 네임 스페이스를 반환합니다!? 키를 생성 할 때