2010-07-25 9 views
0

Je dois prendre un objet à partir d'un EntityGroup et le stocker en dehors d'un groupe d'entités, je pense que la façon la plus simple de l'expliquer est de montrer le code. Dans le code suivant, la fonction removeMessage() annulera les deux appels au gestionnaire de persistance?Comprendre si cette transaction dans JDO est sûr

est-il un moyen de tester, à savoir comment puis-je simuler la deuxième makePersistent défaut de demande?

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

} 

En d'autres termes, je dois vous assurer qu'il ne soit pas dans un état où un message disparaît complètement.

Répondre

2

Transactions sur App Engine ne fonctionnent que dans un seul groupe d'entités - à savoir, les entités du même parent. En Java, je crois que cela est implémenté par des entités 'possédées'.

Depuis l'entité que vous créez n'a pas de parent, il est clairement pas dans le même groupe d'entités, de sorte que cela ne fonctionnera pas. Vous n'avez pas besoin de simuler quoi que ce soit - l'environnement de développement va lancer une exception si vous essayez d'exécuter une transaction invalide.

+1

Il est maintenant possible d'effectuer des transactions intergroupes avec JDO. Voir: https://developers.google.com/appengine/docs/java/datastore/transactions – eeeeaaii