1

Was die Art und Weise ist das Ausfallen von keine Sitzung mit JPA-Repository in folgendem Fall zu verhindern:Prevent keine Sitzung nicht bei Repo-Methoden JPA vorbei

Ich habe eine Klasse namens X mit Bezug @OneToMany mit fetch = FetchType.LAZY zu Klasse Y. Ich erstelle die gesamte Methode in einem Repository, dann übergebe ich sie an die Service-Klasse und überlasse sie danach dem Controller.

Während Ich möchte das Objekt Y aus der Klasse X von x.getY() erhalten, die über Lazy fetchType zusammenhängt ich einen Fehler (von Hibernate) genannt keine Sitzung.

Wie kann ich diesen Fehler verhindern?

Antwort

1

Sie müssten den x.getY() Aufruf innerhalb Ihrer @Transactional Methode einfügen oder die Transaktionsgrenzen höher in der Aufrufhierarchie verschieben, so dass Aufruf ebenfalls enthalten ist.

Im Allgemeinen würde ich nicht mehr bewegen, als der Dienst so, wenn Sie Zugriff auf diese Eigenschaft zum ersten Mal im Controller zum Beispiel dann andere mögliche Optionen wären:

  • Eifrig holt all erforderlichen Abhängigkeiten während die Sitzung geöffnet ist noch (Join fetch)
  • Verwendung Hibernate.initialize(x.getY()); Innenseite des Transaktionskontext
  • Anruf size Methode auf dem depenedent colle sie initialze x.getY().size.
+0

Ich würde dazu neigen, die '@ Transactional' zu verwenden, aber bitte sagen Sie mir, wenn ich richtig bin - ich brauche' import org.springframework.transaction.annotation.Transactional; '? – bielas

+0

Ja genau. Sie müssen jedoch daran denken, dass Sie zusätzliche Konfiguration (Paket-Scan-und Transaktionsmanagement) verwenden müssen. Check out http://www.baeldung.com/transaction-configuration-with-jpa-and-spring –

+0

Auch wenn ich Spring Boot benutze? – bielas