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! .
möglich diuplicate: http://stackoverflow.com/questions/345705/hibernate-lazyinitializationexception-could-not-initialize-proxy –
Überprüfen der Sitzung ist am Leben oder nicht wird nicht helfen. Sie müssen herausfinden, warum die Ausnahme auftritt. –
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. –