Umgang mit einem geschlossenen EntityManager mit Bisna / Doctrine2

9

Nach einer Integritätsbeschränkungsverletzung unter Verwendung von Doctrine2 schließt der EntityManager so gerne, dass der EntityManager nicht weiter verwendet werden kann. Der vorherrschende Gedanke scheint zu sein, dass du einen neuen EntityManager erstellen solltest, anstatt diese einfache Ausnahme zu fangen und sie auf eine anmutige Art und Weise zu behandeln (wundervolles Design, Leute / Sarkasmus).

Bei der Verwendung der Bisna-Bibliothek / ZF 1.12 mit einem geschlossenen Entity-Manager tritt jedoch ein Problem auf. Die Bisna-Bibliothek bietet keine öffentliche Methode, um einen neuen EntityManager mit demselben Namen (d. H. "Standard") zu erstellen, nachdem dieser in der Container-Klasse geschlossen wurde.

Meine Frage ist der beste Weg, um mit diesem Problem umzugehen. Es muss lediglich eine Möglichkeit geben, nach einer Integritätsbedingungsverletzung ordnungsgemäß wiederhergestellt zu werden.

    
VTEX 05.09.2012, 05:02
quelle

2 Antworten

2

Anstatt zu versuchen, sich von diesen Situationen zu erholen, sollten Sie sich auf verhindern Integritätseinschränkungen konzentrieren:

  • Wenn Sie eine Fremdschlüsseleinschränkung treffen, binden Sie die Entitäten nicht richtig zusammen.
  • Wenn Sie eine eindeutige Integritätsbedingung treffen, sollten Sie die Datenbank nach möglichen doppelten Daten durchsuchen, bevor Sie versuchen, sie persistent zu machen.
  • Wenn Sie einen anderen Constraint-Typ treffen und nicht wissen, wie Sie ihn verhindern können, fragen Sie bitte:)

UPDATE:

Der Grund, warum Doctrine2 den EntityManager schließt, ist, dass es in den meisten Fällen nicht mehr sicher zu verwenden ist. Seine UnitOfWork enthält Operationen, die nicht ausgeführt werden können (daher die Ausnahme, die ausgelöst wird).

Sie haben Recht, dass die Bisna-Bibliothek das Erstellen eines neuen EntityManagers nicht unterstützt. Sie können es erweitern, um solche Funktionalität selbst zu implementieren.

Eine andere Lösung wäre, Transaktionen abzuwickeln manuell :

%Vor%

Wenn Sie $em->close() durch $em->clear() ersetzen, bleibt der EntityManager offen und sauber, um ihn erneut zu verwenden.

Ich ermutige Sie , den EntityManager entweder zu schließen oder zu löschen , da die darin enthaltenen Daten (fast immer) nicht mehr verwendbar sind.

    
Jasper N. Brouwer 26.03.2013 09:20
quelle
0

Die manuelle Verarbeitung von Transaktionen schien für mich nicht die Lösung zu sein. Doctrine hat den Entity Manager immer noch geschlossen, auch wenn ich nur die Clear-Methode verwendet habe. Ich habe Bisna gegabelt und einige Änderungen an der Container-Klasse vorgenommen, indem ich eine "resetEntityManager" -Methode hinzugefügt habe, die anscheinend gut funktioniert.

Nun sieht mein Code so aus:

%Vor%

Überarbeitete Container-Klasse ist hier:

Ссылка

    
Aaron Lozier 30.04.2014 15:21
quelle

Tags und Links