JSF Hibernate no session or session was closed

G

Gast2

Gast
Hallo zusammen,

ich bekomme immer eine hibernate error, den ich mir nicht erklären kann:
Code:
Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: test.A, no session or session was closed
	at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383) [:3.6.0.Final]
	at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375) [:3.6.0.Final]
	at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:368) [:3.6.0.Final]
	at org.hibernate.collection.AbstractPersistentCollection.write(AbstractPersistentCollection.java:208) [:3.6.0.Final]
	at org.hibernate.collection.PersistentBag.add(PersistentBag.java:297) [:3.6.0.Final]
	at faces.beans.controller.StatusBeanController.findSendung(StatusBeanController.java:83) [:]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_24]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [:1.6.0_24]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [:1.6.0_24]
	at java.lang.reflect.Method.invoke(Method.java:597) [:1.6.0_24]
	at org.apache.el.parser.AstValue.invoke(AstValue.java:196) [:6.0.0.Final]
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276) [:6.0.0.Final]
	at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:43) [:6.0.0.Final]
	at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:56) [:6.0.0.Final]
	at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:43) [:6.0.0.Final]
	at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:56) [:6.0.0.Final]
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:102) [:2.0.3-]
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:84) [:2.0.3-]
	... 30 more

Beispiel:
Java:
@Entity
public class A{
	@Id
	@GeneratedValue
	private Long id;
@OneToMany(cascade = CascadeType.ALL)
private List<B> bs = new LinkedList<B>();

//get set
}

Java:
@Entity
public class B{
	@Id
	@GeneratedValue
	private Long id;

}

In meiner Bean habe ich folgendes:
Java:
@Named
@RequestScoped
public class AController{
	public void findA(){
		a= aService.searchEntityById(aID);

		a.getBs().add(new B());-->hier krachts
	}
Was ich nicht verstehe ist wenn ich sowas mache das klappt wunderbar nur wenn ich davor ein em.find mache klappt es nicht???:L
Java:
@Named
@RequestScoped
public class AController{
	public void findA(){
		A a= new A();
		a.getBs().add(new B());
               aService.searchEntityById(a);
	}


Hab die services und daos mal weg gelassen
 

brauner1990

Bekanntes Mitglied
Du musst erst noch die Liste laden, du hast Sie auf lazy stehen, dabei wird erst nachgeladen wenn die Liste benötigt wird, Wenn du dies auf eager stellst sollte das Problem weg sein, nur dann braucht der Ladevoragang natürlich auch länger beim 1. Objekt
 
G

Gast2

Gast
Du musst erst noch die Liste laden, du hast Sie auf lazy stehen, dabei wird erst nachgeladen wenn die Liste benötigt wird, Wenn du dies auf eager stellst sollte das Problem weg sein, nur dann braucht der Ladevoragang natürlich auch länger beim 1. Objekt

Mit dem getter sollte die Liste geladen werden, oder?
 

JimPanse

Bekanntes Mitglied
LAZY würde ich immer expliziet nachladen Bsp:

mit einem inner join über JPA

Java:
"from BspClass c join fetch c.<feld>"

oder du verwendest Hibernate Criteria:
Java:
	DetachedCriteria crit = DetachedCriteria.forClass(BspClass.class);
        crit.setFetchMode("<feld>", FetchMode.JOIN);

Grüße
 
G

Gast2

Gast
LAZY würde ich immer expliziet nachladen Bsp:

mit einem inner join über JPA

Java:
"from BspClass c join fetch c.<feld>"

oder du verwendest Hibernate Criteria:
Java:
	DetachedCriteria crit = DetachedCriteria.forClass(BspClass.class);
        crit.setFetchMode("<feld>", FetchMode.JOIN);

Grüße

Ja aber dann kann ich ja gleich Eager laden

EDIT: Ich glaube mit EclipseLink hatte ich solche Probleme nicht^^
 
Zuletzt bearbeitet von einem Moderator:

JimPanse

Bekanntes Mitglied
Kommt auf den Anwedungsfall an:

1. Die Assoziation beinhaltet wenig Elemente und du benötigst diese immer (User + alle seine Rollen) EAGER
2. Die Assoziation wird sehr selten gebraucht (User + alle seine Rechnungen) dann würde ich es nicht machen außer dir ist Performance völlig wurst.
3. EAGER geht immer nur für eine Collection in einer Klasse d.h. wenn du mehrere Collections in einer Klasse hast wirst du nicht drum rumkommen diese nachzuladen.


Grüße
 
G

Gast2

Gast
Kommt auf den Anwedungsfall an:

1. Die Assoziation beinhaltet wenig Elemente und du benötigst diese immer (User + alle seine Rollen) EAGER
2. Die Assoziation wird sehr selten gebraucht (User + alle seine Rechnungen) dann würde ich es nicht machen außer dir ist Performance völlig wurst.
3. EAGER geht immer nur für eine Collection in einer Klasse d.h. wenn du mehrere Collections in einer Klasse hast wirst du nicht drum rumkommen diese nachzuladen.


Grüße

Ja die Anwendungsfälle sind mir klar.

Aber ich verstehe nicht warum ich alle einträge brauche um der liste was hinzuzufügen.
 

JimPanse

Bekanntes Mitglied
Das wiederrum liegt an deinem Design :D

Stichwort: Bi-Direktional
Java:
public class A{

@OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade=Cascade.ALL)
private List<B> lists;

//getter & setter
}

public class B{

@ManyToOne(fetch=FetchType.LAZY)
private A a;

//getter & setter
}

public void createNewB(Long id){

A a = em.find(A.class,id);

//neues B
B b = new B();
b.setA(classA);//Referenz auf A setzen!
em.persist(b);
}

oder du machst es Uni-direktional (also gerichtet) verwendest nur @ManyToOne um die Referenz von A in B zusetzen. :D jetzt ist die Verwirrung Perfekt :)
 
Zuletzt bearbeitet:
G

Gast2

Gast
Das wiederrum liegt an deinem Design :D

Stichwort: Bi-Direktional
Java:
public class A{

@OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade=Cascade.ALL)
private List<B> lists;

//getter & setter
}

public class B{

@ManyToOne(fetch=FetchType.LAZY)
private A a;

//getter & setter
}

public void createNewB(Long id){

A a = em.find(A.class,id);

//neues B
B b = new B();
b.setA(classA);//Referenz auf A setzen!
em.persist(b);
}

oder du machst es Uni-direktional (also gerichtet) verwendest nur @ManyToOne um die Referenz von A in B zusetzen. :D jetzt ist die Verwirrung Perfekt :)

Ich hab eine undirektionale...
 
M

maki

Gast
Ja aber dann kann ich ja gleich Eager laden
Der Unterschied ist, dass du mit fetch joins bzw. explizitem fetch mode entscheiden kannst, wann diese Assoziation gleich mitgeladen werden, idealerweise immer dann, wenn man sie benötigt, zwingerderweise immre dann, wenn ausserhalb der Session auf sie zugegriffen werden soll, dazu muss man die Use Cases kennen.
Kurz: Das ist ein Vorteil in Bezug auf Performance, kein Nachteil.

EDIT: Ich glaube mit EclipseLink hatte ich solche Probleme nicht^^
Hättest du dasselbe mit EclipseLink gemacht, hättest du dasselbe Problem ;)
Eager/Lazy Loading ist eigentlich immer ziemlich gleich ;)
 
G

Gast2

Gast
Der Unterschied ist, dass du mit fetch joins bzw. explizitem fetch mode entscheiden kannst, wann diese Assoziation gleich mitgeladen werden, idealerweise immer dann, wenn man sie benötigt, zwingerderweise immre dann, wenn ausserhalb der Session auf sie zugegriffen werden soll, dazu muss man die Use Cases kennen.
Kurz: Das ist ein Vorteil in Bezug auf Performance, kein Nachteil.
Da es sich hier um einen Prototyp handelt wird die Performance (noch) keine Rolle spielen. Aber verstehen würde ich es trotzdem gerne =)

Hättest du dasselbe mit EclipseLink gemacht, hättest du dasselbe Problem ;)
Eager/Lazy Loading ist eigentlich immer ziemlich gleich ;)

Muss ich mal tesen wenn ich Zeit hab^^
 
M

maki

Gast
Da es sich hier um einen Prototyp handelt wird die Performance (noch) keine Rolle spielen. Aber verstehen würde ich es trotzdem gerne =)
Nun ja, das gehört doch zu den Basics, Lazy Loading ist für Collections u.a. default, weil man einerseits verhindern möchte, das irgendwann die ganze DB im Ram steht, andererseits nicht allzuviele Objekte erzeugen möchte die man u.U. nicht braucht.
Wenn die Session offen ist, ist es "nur" ein perforamce Problem, denn wenn ich auf eine Lazy Collections zugreife während die Session offen ist, wird diese in dem Moment aus der DB nachgeladen, also ein weiteres SQL Statement abgesetzt, zusätzlich zum ersten um die Entity zu laden.
Mit Eager Loading/join fetch/explizitem fetch mode würde insgesamt nur 1 SQL Statement abgesetzt um die Entitiy und die Collection zu laden, aber mit eager loading ist das fix, mit fetch groups oder fetch mode kann die Relation auf lazy bleiben und wird im Bedarfsfall dann doch eager geladen.

Mit Lazy Loading und einer geschlossenen Session kracht es eben -> LazyInit Exception, du versuchst auf ein Attribut zuzugreifen das noch gar nicht geladen ist und nicht (lazy) nachgeladen werden kann weil die Session schon zu ist.

JDO unterstützt auch lazy/eager loading und fetch groups, selbes Prinzip, gehört wie gesagt zu den ORM Basics.
 
G

Gast2

Gast
Ich glaube ich hab mich falsch ausgedrückt, ich bin eher verwirrt warum meine session zu ist.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Hibernate: Session vs EntityManager Data Tier 3
S Hibernate - session-per-request/open session view oder was? Data Tier 3
S Hibernate: Session is closed! Data Tier 7
T Hibernate/Spring JPA: eigene ID generieren Data Tier 5
Avalon @ManyToOne Hibernate oder JPA? Data Tier 5
D Hibernate Hibernate mit MariaDB Data Tier 1
ToBJo Hibernate Glassfish deploy mit Hibernate schlägt fehl Data Tier 1
C JPA Hibernate Map<String,String> richtig mappen Data Tier 2
S JPA Hibernate Search & EclipseLink (oder OpenJPA) Data Tier 0
R JPA Probleme mit Wechsel von EclipseLink auf Hibernate Data Tier 4
ARadauer Hibernate Entität readonly laden... Data Tier 1
G Hibernate SQL in Hibernate: Keine Parameter mit Index? Data Tier 2
P Wildfly + Hibernate + SQL Server Data Tier 0
E JPA Hibernate Query mit Timestamp hat seltsames Verhalten Data Tier 1
M Eclipse 4 RCP Hibernate Problem Data Tier 3
C Hibernate ProgressBar updaten mit Daten aus Hibernate Data Tier 4
B Hibernate und MySQL testen Data Tier 8
I Hibernate HQL: generiertes SQL ausgeben Data Tier 1
R mapping-file für hibernate zum Überschreiben der Annotationen Data Tier 7
R Hibernate Hibernate und Logback Data Tier 2
R Hibernate möchte Schema zwei mal undeployen Data Tier 2
F Hibernate Hibernate / JPA Data Tier 4
C Hibernate Hibernate Code Generation Data Tier 3
S Hibernate Mehrfachverbindung mit Hibernate Data Tier 3
M Hibernate Einstiegsfrage Data Tier 5
M Exception in thread "main" org.hibernate.MappingException: java.lang.ClassNotFoundException: Message Data Tier 4
S Hibernate Einstieg in Hibernate 3.2 sinnvoll? Data Tier 8
P JPA Eigene Vererbungsstrategie mit JPA / Hibernate Data Tier 2
J Hibernate Problem bei Master-Detail-Tabellen Data Tier 5
Y Jboss seam-hibernate-jpa Data Tier 5
RaoulDuke Hibernate Map<String,String> mit Annotations mappen Data Tier 2
M Hibernate Hibernate with GWT Data Tier 4
C Hibernate JPA mysql db erstellen Data Tier 4
M Hibernate Hibernate liest Daten zu oft aus! Data Tier 16
pg1337 Hibernate Fragen Data Tier 11
D Probleme bei Left Joins mit Hibernate createCriterias() Data Tier 2
D Hibernate probleme mit Verlinkungstabelle Data Tier 4
2 Hibernate Annotations Data Tier 7
G Hibernate select update no wait Data Tier 8
Z Hibernate: Many-To-Many nur eine bestimmte Spalte Data Tier 3
K Hibernate - Envers - Erzeugung der SQL Skripte Data Tier 4
G Hibernate 1:n Beziehung mit Vererbung Data Tier 5
D Hibernate-Criteria-API (Projections und MAX-Funktion) Data Tier 6
L Hibernate: failed to lazily initialize a collection of role Data Tier 3
S Hibernate hibernate.cfg.xml Data Tier 14
D JPA vs Hibernate.cfg und Entitymanager Data Tier 6
H Hibernate - Mapping für Enumeration Data Tier 1
R Hibernate Criteria Abfrageproblem Data Tier 2
A Hibernate und jdbc zusammen Data Tier 4
D Mit Hibernate aus JUnit ein DB-Schema erzeugen Data Tier 6
S [Hibernate] No Persistence provider for EntityManager Data Tier 5
B Problem mit org.hibernate.LazyInitializationException Data Tier 11
G Hibernate HQL und Interface Data Tier 4
T JPA2/Hibernate: Many-to-Many-Relation wird u.a. beim löschen nicht aktualisiert Data Tier 14
S (Hibernate) Mapping einer Datenbanktabelle mit mehreren Fremdschlüssel Data Tier 7
X [Hibernate] Zusammengesetzte Entities möglich? Data Tier 7
N Hibernate Fake? Data Tier 2
S Problem beim Insert mit Hibernate Data Tier 9
V Hibernate Projection Data Tier 2
T org.hibernate.impl.SessionFactoryImpl Memory Leak Data Tier 10
G Hibernate Composite key Data Tier 11
X [Hibernate] Connection Pool - MinSize ? Data Tier 2
R Hibernate Criteria OR Data Tier 2
T hibernate/jpa abgefragte Listen immer mit Null-Werten gefüllt Data Tier 8
X [Hibernate] Anderen Connection Pool - Vorschläge? Data Tier 3
ARadauer Hibernate DDL Loggen Data Tier 6
G Hibernate abfrage Collection Data Tier 3
X [Hibernate] ReverseEngineering - Eigene Strategy verwenden? Data Tier 3
R Hibernate Criteria .group größer als Data Tier 5
R Hibernate daten laden Data Tier 7
H [Hibernate]1:1 Beziehung Data Tier 8
H [Hibernate]No CurrentSessionContext configured! Data Tier 6
X [Hibernate] Lässt sich die Dauer eines SELECTs loggen? Data Tier 4
R Hibernate n:n Relationtabelle mit Date Data Tier 3
H [Hibernate] Unknown Entity Data Tier 3
H [Hibernate] Configuration Data Tier 3
C [Hibernate] Generierung von hbm.xml to Java Data Tier 4
lumo Eclipse & JPA & Hibernate & Derby Data Tier 5
J Zufallsauswahl aus ResultList bei JPA(Hibernate) / Performance Data Tier 3
M Hibernate: Datum 0001-01-01 erzeugt null-Datum Data Tier 4
G Datenbankzugriff mit Hibernate Data Tier 7
Y Hibernate - Angabe des Schemas Data Tier 6
LadyMilka (Hibernate) in Criteria implizierter Join durch Subquery's Data Tier 8
M Hibernate Mehr als 1 Object speichern? Data Tier 18
M Unerklärliche Hibernate Exception Data Tier 20
LadyMilka (Hibernate) subquery in FROM-Clause Data Tier 9
haemi Viele DTOs in hibernate IdentityMap Data Tier 3
LadyMilka (hibernate) UNION dem Dialekt hinzufügen Data Tier 3
M Hibernate + Oracle 10g XE Data Tier 3
lumo Hibernate - entity class not found Data Tier 5
P SQL PRoblem Hibernate? Data Tier 8
J Vererbung mit JPA / Hibernate - pro/contra Data Tier 3
T JBoss/Hibernate: Abfrage dauert lang + hohe CPU? Data Tier 19
7 Hibernate-Abfrage (SubSelect im FROM) Data Tier 2
G Hibernate: many-to-one - Verwaiste Datensätze löschen Data Tier 2
G Layer für Datenbankzugriff Hibernate Data Tier 5
G Hibernate Zwischentabelle Data Tier 2
Java.getSkill() Hibernate und Spalte vom Typ xml Data Tier 6
G Hibernate 0...1 : 1 Beziehung Data Tier 6
G Hibernate mehrere @oneToone Data Tier 2

Ähnliche Java Themen

Neue Themen


Oben