IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Doctrine2 PHP Discussion :

Rollback et persist


Sujet :

Doctrine2 PHP

  1. #1
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut Rollback et persist
    Bonjour à tous,

    Je souhaite persister un objet possédant une collection.
    Dans une méthode qui s'occupe de gérer l'enregistrement du formulaire, j'ouvre donc une transaction dans laquelle j'enchaine persist(), flush() et commit(). Le persist cascade se fait alors correctement puisque les méthodes PrePersist se trouvant sur les objets de la collection sont bien appelés.

    Le souci c'est qu'en cas d'erreur après le persist, je catch une exception, j'exécute un rollback (au cas ou certains enregistrements seraient passés quand même) mais ce que je souhaite c'est retrouver ma collection dans l'état dans lequel elle se trouvait juste après l'avoir bind. Toute les modifications dues au persist() et aux méthodes prePersist() je ne veux pas les retrouver.
    Mes nouveaux items qui se sont rajoutés à la collection possèdent un id par exemple : même s'ils n'ont pas été flush ou commit, ils ont été persistés et un id leur a été assigné, la date de création ou de modification également lors du prePersist : toutes ces infos je veux qu'elles disparaissent, mais je veux que les objets restent puisque je désire les réafficher dans le formulaire : comme s'il y avait eu une erreur de validation de form.

    Voilà à quoi ressemble ma méthode actuellement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    public function processEntityForm(Entity $objEntity)
        {
            // Mon objet $objEntity n'a encore subi aucune modification
            // Si ça tourne mal, je veux le réafficher dans mon form dans cet état là
     
            foreach ($objEntity->getItems() as $objItem) {
                // Ici plein de modifications sur mes items
            }
     
            // Enregistrement des modifications
            try {
                $this->objEm->beginTransaction();
                $this->objEm->persist($objEntity);
                $this->objEm->flush(); // Une exception est levée à cet endroit
                $this->objEm->commit();
            } catch (\Exception $ex) {
                $this->objEm->rollback();
                // Que dois-je faire ici pour récupérer mon objet Entity tel qu'il était au départ
                throw $ex;
            }
        }
    J'avais pensé à cloner mon $objEntity au départ et le remplacer dans mon EntityManager en cas d'exception mais ça me parrait quelque peu bourrin. Je suis intimement persuadé que quelque chose de plus simple m'échappe.

    Merci d'avance.

  2. #2
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    J'up au fur et à mesure de ma progression : quelqu'un sera peut-être en mesure de m'aider.

    La méthode que je cherchais est tout simplement la méthode refresh() qui permet d'après la documentation de récupérer l'entité telle qu'elle est stockée en base.

    Le souci c'est que j'ai besoin de faire ce refresh() après un flush. Donc dans mon block catch, je commence par faire un rollback(), suite à quoi mon refresh devrait me retourner mon entité non-modifiée.

    En faisant un dump de mon entité après le rollback() et le refresh(), les modifications que j'ai fait sont toujours présentes : quelqu'un saurait-il me dire pourquoi ou ce qui me manque pour récupérer mon entité dans son état initial.

    Un petit rappel de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public function processEntityForm(Entity $objEntity) // etat initial de $objEntity
    {
    	// Ici plein de modifications sur $objEntity
     
    	// Enregistrement des modifications
    	try {
    		$this->objEm->beginTransaction();
    		//$this->objEm->persist($objEntity); Il s'agit d'un update : $objEntity est déja persisté
    		$this->objEm->flush(); // Ici d'autres modifications
    		throw new \Exception('test');
    		$this->objEm->commit();
    	} catch (\Exception $ex) {
    		$this->objEm->rollback();
    		$this->objEm->refresh($objEntity);
    		// Mon $objEntity devrait être dans son état initial mais ce n'est pas le cas
    		throw $ex;
    	}
    }

Discussions similaires

  1. Rollback ne marche pas avec interbase
    Par Tsimplice dans le forum Bases de données
    Réponses: 2
    Dernier message: 09/03/2004, 08h39
  2. [Persistence][Framework]Avis.
    Par quilo dans le forum Persistance des données
    Réponses: 5
    Dernier message: 10/09/2003, 14h55
  3. Le rollback explose au moment du FETCH d'un Curseur
    Par Krashtest dans le forum Administration
    Réponses: 10
    Dernier message: 18/08/2003, 09h46
  4. commit et rollback....?
    Par The_Nail dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 06/06/2003, 14h36
  5. [VB6]ADODB Command, recuperer l'info d'un RollBack
    Par Mouse dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 19/05/2003, 16h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo