2010-01-02 5 views
1

J'ai un peu de problème avec la persistance JDO d'une liste d'objets récupérés.Google App Engine (Java) + Spring géré PersistenceManager

Ce que je veux faire est de:

  • Fetch liste des "Commandes"
  • Modifier une propriété "statut"
  • Faire la mise à jour majeure partie des "Commandes"

Qu'est-ce que J'ai jusqu'à présent est "Objet avec id ... est géré par un gestionnaire d'objets différent". Mais attendez, je n'ai pas fait face à un tel problème sans le printemps!

J'ai essayé de le déboguer comme:

List<Orderr> orders = orderDao.findByIdAll(ordersKeys); 
for(Orderr o : orders) { 
    System.out.println(JDOHelper.getPersistenceManager(o).hashCode()); 
    //hashcode is 1524670 
    o.setSomething(somevalue); 
} 
orderDao.makePresistentAll(orders); //hashcode inside is 31778523 

makePersistentAll ne fait rien:

try { 
    System.out.println(getPersistenceManager().hashCode()); 
    getPersistenceManager().makePersistentAll(entities); 
} finally { 
    getPersistenceManager().close(); 
} 

Toutes mes OTI étendent JdoDaoSupport. Le Pmf est injecté et géré au printemps. Enfin, voici la question: Pourquoi le gestionnaire de persistance est-il fermé après findByIdAll? Ou pourquoi ai-je une nouvelle instance de gestionnaire de persistance? Ma méthode findByIdAll n'appelle pas de close sur le gestionnaire de persistance, bien sûr.

Bien sûr, si j'appelle makePersistent pour chaque "commande" cela fonctionne bien. Mais il rompt la superposition de la logique des affaires et base de données ...

UPD viens de découvrir que tous les appels à makePersistentAll ne fonctionnent pas du tout après la migration au printemps réussi PersistenceManager. Avant le printemps, j'utilisais le vieux assistant PMF.get() et tout était brillant!

Répondre

1

Si votre application reste active en réponse à une requête HTTP pendant plus de 30 secondes, elle sera supprimée. Une partie du mode de fonctionnement de GAE est que vos applications ne sont pas de longue durée. Du tout.

Bien que vous ne le fassiez pas sur un site personnel, vous devrez vous habituer à avoir uniquement un accès à court terme à votre gestionnaire de session DB. Il faut parfois beaucoup de temps pour le rouvrir à chaque transaction, mais c'est ainsi que GAE fait évoluer le processus. Si vous avez vraiment beaucoup de trafic, il peut exécuter votre application en parallèle sur plusieurs serveurs.

+0

Bien que je développe l'application GAE, ce n'est pas spécifique. J'ai la même chose sur localhost SDK (rien que Jetty). Et j'ai pensé que, comme vous le dites, "Gestionnaire de session DB" est PersistenceManagerFactory mais pas PersistenceManager. Je peux récupérer mon ancien PersistenceManager de chaque objet, mais ce n'est pas comme ça que je devrais le faire. Cela signifie que ce n'est pas fermé du tout, mais enlevé au printemps de Dao, je suppose. – vshulyak

+0

Hmm. Ensuite, je pense que nous sommes allés au-delà de ma capacité à vous aider. J'ai utilisé du printemps dans une application GAE, mais notre relation n'était pas heureuse.Désolé, et bonne chance! –

+0

Merci! Oui, la question n'est pas évidente ... – vshulyak

0

C'est un peu magique. Chaque fois que je pose une question, je connais la réponse à ma question dans les 24 heures après la publication.

Bien sûr, usine par sa signification devrait toujours créer une nouvelle instance pm. Maintenant, je garde la référence à mon ancien pm (comme je l'ai fait avant le printemps jdo daos) et tout est ok.