2016-03-25 5 views
1

Ich bin vor Transaktionsfehler wie:Wie testen, ob die Hibernate-Sitzung geöffnet ist?

org.hibernate.LazyInitializationException: failed träge zu eine Sammlung von Rolle initialisieren: app.Parent.children konnte nicht Proxy initialisieren - keine Session

Hier auf parent.getChildren().size().

Aber ich eine @Transactional auf @Service Methoden haben:

  • 1 Transaktion auf createFactory() eine Fabrik zu erstellen und geben dem EntityManager
  • 1 Transaktion auf create() der Entität erstellen
@Path("api/parents") 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
@Controller 
public class ParentResource { 

    @Autowired 
    private ParentService parentService; 

    @POST 
    public Parent create(Parent parent) { 
     ParentFactory parentFactory = parentService.createFactory(parent); 
     return parentService.create(parent); 
    } 

} 

@Service 
public class ParentService { 

    @PersistenceContext 
    private EntityManager em; 

    @Transactional 
    public ParentFactory createFactory(Parent parent) { 
     return new ParentFactory(parent, em); 
    } 

    @Transactional 
    public Parent create(ParentFactory parentFactory) { 
     return parentFactory.create(); 
    } 

} 

// No Transactional annotation 
public class ParentFactory { 

    private Parent parent; 
    private EntityManager em; 

    public ParentFactory(Parent parent, EntityManager em) { 
     this.parent = parent; 
     this.em = em; 
    } 

    public parent create() { 
     if(parent.getChildren().size() < 3) { // Exception here 
      em.persist(this.parent); 
     } 
    } 

} 

Ich möchte in der Lage zu testen, wenn meine Hibernate Session lebt oder nicht, so dass ich check k wenn es verloren ist und warum.

Danke! .

+0

möglich diuplicate: http://stackoverflow.com/questions/345705/hibernate-lazyinitializationexception-could-not-initialize-proxy –

+0

Überprüfen der Sitzung ist am Leben oder nicht wird nicht helfen. Sie müssen herausfinden, warum die Ausnahme auftritt. –

+0

Die Sitzung wird geschlossen, sobald die Transaktionsmethode abgeschlossen ist. Sie haben 2 Transaktionsmethoden, die jeweils eine neue Sitzung/einen neuen Entitätsmanager öffnen. Die Sitzung, die ursprünglich für das Elternobjekt verwendet wurde, ist bereits geschlossen, daher der Fehler. Drücken Sie diese Logik in eine einzige transaktionale Service-Methode (wie es sollte imho) statt in Ihrem Controller. –

Antwort

-1

Versuchen mit session.getTransaction() isActive()

0

Ich denke, der beste Weg, um Ihre Anforderung zu handhaben zu verwenden ist JPA Validator @size (min = 3) auf den Kindern Eigenschaft

+0

Danke @ oliv37, aber hier meine Frage ist mehr darüber, wie man weiß, wann ich eine geschlossen habe Session. – Pleymor

Verwandte Themen