2010-07-25 31 views
0

我需要從EntityGroup中取出一個對象並將其存儲在實體組之外,我認爲解釋它的最簡單方法是顯示代碼。在下面的代碼中,removeMessage()函數是否會回調這兩個調用到持久性管理器?瞭解JDO中的這個事務是否安全

有沒有辦法來測試這個,即我該如何模擬第二個makePersistent請求失敗?

// Not meant to compile, it is for example only 
public class UndeliveredMessages { 

    private Key key; 
    private long count = 0; 
    private Set<Message> messages = HashSet<Message>(); 

    public void removeMessage(Message message) { 
      Transaction tx = pm.currentTransaction(); 
      try { 
        count--; 
        messages.remove(message); 
        pm.makePersistent(this); 
        Message item = new Message(); 
        item.setFrom(message.getFrom()); 
        item.setTo(message.getTo()); 
        item.setText(message.getText()); 
        pm.makePersistent(message); // If this one fails, will all of the above be rolled back? 
        tx.commit(); 
      } finally { 
        if (tx.isActive()) 
          tx.rollback(); 
      } 
    } 

    public void addMessage(String from, String to, String message) { 
      count++; 
      messages.put(new Message(from, to, message)); 
      pm.makePersistent(); 
    } 

    public Message getNextMessage() { 
      if(!messages.isEmpty()) 
        return messages.iterator().next(); 

      return null; 
    } 

} 

換句話說,我需要確保它沒有進入消息完全消失的狀態。

回答

2

App Engine上的事務僅在單個實體組內工作 - 即具有相同父級的實體。在Java中,我相信這是由「擁有」實體實施的。

由於您創建的實體沒有父項,因此顯然不屬於同一個實體組,因此這不起作用。你不需要模擬任何東西 - 如果你嘗試執行一個無效的事務,開發環境會拋出異常。

+1

現在可以與JDO進行跨組交易。請參閱:https://developers.google.com/appengine/docs/java/datastore/transactions – eeeeaaii 2012-11-27 13:20:43