JPA lazy loading in EJB

shadow

Aktives Mitglied
Hi,

ich bekomme in meiner Webanwendung folgende Exception:

Java:
failed to lazily initialize a collection of role: ....., no session or session was closed

Hier tritt die Exception auf (Code aufs Wesentliche reduziert):

Java:
@Stateless
public class OrderEJB {

    @PersistenceContext
    private EntityManager entityManager;

    public void doSomethingWithUser(User user) {

        user.getOrders();

    }

}

Das übergebene Userobjekt in doSomethingWithUser() wurde in einer anderen EJB aus der DB geladen.
Komisch ist: Die Exception lautet doch "no session or session was closed". Aber in jeder Methode einer EJB gibt es doch eine Session. Kann IMHO also nur sein, dass die ursprüngliche Session, durch die das "User"-Objekt erzeugt wurde, nicht mehr offen ist. Ist das der Fehler? Ich habe auch probiert, dann ein

Java:
entityManager.merge(user);

zu machen, das hat allerdings überhaupt nichts geändert...

Könnt ihr mir vielleicht erklären, wo hier das Problem liegt?
Vielen Dank!

Stefan
 
G

GIBMIRKRAFT

Gast
Ich kenne die Entity nicht aber der FetchType ist, wenn dieser nicht gesetzt wurde, bei OneToMany standardmäßig LAZY. Um die Liste/Collection/usw immer vollständig zu laden musst du den FetchType ändern. Standard-Bsp.

Java:
public class User {

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<Role> roles;

//getter/setter

}

public class Role  {
//irgendwas
}

So bald eine Entity den SessionContext von EJB verläßt, in deinem Fall in die Web-Ebene gereicht wird, wird auch die Session geschloßen....
 

shadow

Aktives Mitglied
@GIBMIRKRAFT

Das mit dem FetchType wusste ich, ich würde aber tatsächlich gerne Lazy loading machen, also in meiner Methode doSomethingWithUser() erst die Orders nachladen, über die Session, die es dort doch geben muss, oder?

@mvitz
Damit lade ich doch dann auch gleich alle Kind-Objekte, eigentlich ohne dass ich sie sofort brauche, oder? Ich möchte, dass sie erst nachgeladen werden, wenn sie wirklich benötigt werden.

Ich hab sogar von einer dritten Möglichkeit gelesen, und zwar in der "ersten" Session auf der Liste beispielsweise size() aufzurufen. Dadurch müssten die Objekte zwangsweise geladen werden und wären dann auch "detached" verfügbar.
Aber besteht nicht irgendwie die Möglichkeit, die Kind-Objekte später lazy zu loaden, mit einer neuen Session? Ich dachte, das würde mit dem merge() gehen, hat aber nicht funktioniert ... :/
 

Ähnliche Java Themen

Neue Themen


Oben