# Daten mit j2ee aus datenbank abfragen



## wakoz (14. Jun 2009)

Hi

Ich erarbeite in rahmen einer j2ee übung eine Application die Daten in eine beliebige Datenbank schreiben und auslesen kann.

Mein Problem ist momentan das abfragen von daten aus meiner (SQL) Datenbank.

Ich führe ein JUnittest aus und schreibe Daten in verschieden DB-Tabellen alle mit Primärschlüssel verknüpft. 
Der Customer ist inizialiesiert und über diesen müsste ich nicht nur die adresse abfragen können sondern auch seine reservierung (und reservierungs details). 
Leider bekomme ich folgende fehlermeldung:

```
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: sm4_Titan.ejbModule.com.titan.server.ejb.Customer.reservations, no session or session was closed
	at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
	at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
	at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:343)
	at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
	at org.hibernate.collection.PersistentBag.get(PersistentBag.java:422)
	at sm4_Titan.ejbModule.com.titan.test.JUnitCustommerwithOneToMany.testGetCustomer(JUnitCustommerwithOneToMany.java:108)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
	at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
	at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
	at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
	at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
	at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
	at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
	at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
	at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
	at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
```

Meine Test Methode sieht wie volgt aus.


```
@Test
	public final void testGetCustomer() {

		Customer customer = reservationManagerRemote.getCustomer(new Long(1));
		assertNotNull(customer);
		System.out.println(customer.getFirstName());

		List<Reservation> reservation = customer.getReservations();
		Address address = customer.getAddress();
		assertNotNull(reservation);
		System.out.println(address.getAddress());
		 [COLOR="Red"]System.out.println(customer.getReservations()[/COLOR][COLOR="Blue"].get(0).getCabins().get(0).getCabinName());
[/COLOR]	}
```

Ich kann alle daten aus den Tabellen Person und address auslesen.
Aber die daten aus Reservation und(oder) Cabin nicht! ???:L 
Beide (Reservation und Cabins) sind vom Typ List aber daran sollte es nicht liegen.

Hab ich was bei der initaliesierung falsch gemacht? 
Das meiste nimmt mir ja j2ee (JBoss v4.2) über die persistensxml und die mysql-ds ab.
Und über den Customer denn ich ja abrufen kann sind reservation und cabin (Many to one) verbunden.

Der Fehler soll laut JUnittest in der Roten zeile liegen.

die methode aus customer sieht so aus
	
	
	
	





```
@OneToMany(cascade = CascadeType.ALL)
	@JoinColumn(name = "customerId")
	public List<Reservation> getReservations() {
		return reservations;
	}

	public void setReservations(List<Reservation> reservations) {
		this.reservations = reservations;
	}
```


----------



## chr (14. Jun 2009)

Stell den Typ des fetching beim Mapping der Beziehung auf EAGER ein

@javax.persistence.Basic(fetch=FetchType.EAGER)


----------



## wakoz (14. Jun 2009)

Danke



chr hat gesagt.:


> Stell den Typ des fetching beim Mapping der Beziehung auf EAGER ein
> 
> @javax.persistence.Basic(fetch=FetchType.EAGER)



das problem dabei ist aber das ich damit nur die reservation bekomme, für cabin bleibt der fehler bestehen bzw. kann das nicht published werden wenn mehr als ein FetchType existiert.
Und in reservation müsste ich das für Cabin wiederholen


----------



## chr (14. Jun 2009)

Es sollte möglich sein, bei jeder Annotation einer Beziehung

@OneToXXX(....fetch=FetchType.EAGER....)

zu setzen


----------



## wakoz (14. Jun 2009)

```
16:01:03,640 WARN  [ServiceController] Problem starting service persistence.units:jar=newtitan.jar,unitName=titanPU
javax.persistence.PersistenceException: org.hibernate.HibernateException: cannot simultaneously fetch multiple bags
	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:720)
	at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:127)
	at org.jboss.ejb3.entity.PersistenceUnitDeployment.start(PersistenceUnitDeployment.java:246)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.jboss.ejb3.ServiceDelegateWrapper.startService(ServiceDelegateWrapper.java:103)
	at org.jboss.system.ServiceMBeanSupport.jbossInternalStart(ServiceMBeanSupport.java:289)
	at org.jboss.system.ServiceMBeanSupport.jbossInternalLifecycle(ServiceMBeanSupport.java:245)
	at sun.reflect.GeneratedMethodAccessor218.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
	at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
	at org.jboss.mx.server.Invocation.invoke(Invocation.java:86)
	at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
	at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
	at org.jboss.system.ServiceController$ServiceProxy.invoke(ServiceController.java:978)
	at $Proxy0.start(Unknown Source)
	at org.jboss.system.ServiceController.start(ServiceController.java:417)
	at sun.reflect.GeneratedMethodAccessor9.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
	at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
	at org.jboss.mx.server.Invocation.invoke(Invocation.java:86)
	at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
	at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
	at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
	at $Proxy183.start(Unknown Source)
	at org.jboss.ejb3.JmxKernelAbstraction.install(JmxKernelAbstraction.java:120)
	at org.jboss.ejb3.Ejb3Deployment.startPersistenceUnits(Ejb3Deployment.java:627)
	at org.jboss.ejb3.Ejb3Deployment.start(Ejb3Deployment.java:351)
	at org.jboss.ejb3.Ejb3Module.startService(Ejb3Module.java:91)
	at org.jboss.system.ServiceMBeanSupport.jbossInternalStart(ServiceMBeanSupport.java:289)
	at org.jboss.system.ServiceMBeanSupport.jbossInternalLifecycle(ServiceMBeanSupport.java:245)
	at sun.reflect.GeneratedMethodAccessor218.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
	at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
	at org.jboss.mx.server.Invocation.invoke(Invocation.java:86)
	at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
	at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
	at org.jboss.system.ServiceController$ServiceProxy.invoke(ServiceController.java:978)
	at $Proxy0.start(Unknown Source)
	at org.jboss.system.ServiceController.start(ServiceController.java:417)
	at sun.reflect.GeneratedMethodAccessor9.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
	at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
	at org.jboss.mx.server.Invocation.invoke(Invocation.java:86)
	at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
	at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
	at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
	at $Proxy33.start(Unknown Source)
	at org.jboss.ejb3.EJB3Deployer.start(EJB3Deployer.java:512)
	at sun.reflect.GeneratedMethodAccessor198.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
	at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
	at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133)
	at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
	at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:142)
	at org.jboss.mx.interceptor.DynamicInterceptor.invoke(DynamicInterceptor.java:97)
	at org.jboss.system.InterceptorServiceMBeanSupport.invokeNext(InterceptorServiceMBeanSupport.java:238)
	at org.jboss.wsf.container.jboss42.DeployerInterceptor.start(DeployerInterceptor.java:87)
	at org.jboss.deployment.SubDeployerInterceptorSupport$XMBeanInterceptor.start(SubDeployerInterceptorSupport.java:188)
	at org.jboss.deployment.SubDeployerInterceptor.invoke(SubDeployerInterceptor.java:95)
	at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
	at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
	at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
	at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
	at $Proxy34.start(Unknown Source)
	at org.jboss.deployment.MainDeployer.start(MainDeployer.java:1025)
	at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:819)
	at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:782)
	at sun.reflect.GeneratedMethodAccessor21.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
	at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
	at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133)
	at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
	at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:142)
	at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
	at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
	at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
	at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
	at $Proxy9.deploy(Unknown Source)
	at org.jboss.deployment.scanner.URLDeploymentScanner.deploy(URLDeploymentScanner.java:421)
	at org.jboss.deployment.scanner.URLDeploymentScanner.scan(URLDeploymentScanner.java:610)
	at org.jboss.deployment.scanner.AbstractDeploymentScanner$ScannerThread.doScan(AbstractDeploymentScanner.java:263)
	at org.jboss.deployment.scanner.AbstractDeploymentScanner$ScannerThread.loop(AbstractDeploymentScanner.java:274)
	at org.jboss.deployment.scanner.AbstractDeploymentScanner$ScannerThread.run(AbstractDeploymentScanner.java:225)
Caused by: org.hibernate.HibernateException: cannot simultaneously fetch multiple bags
	at org.hibernate.loader.BasicLoader.postInstantiate(BasicLoader.java:66)
	at org.hibernate.loader.entity.EntityLoader.<init>(EntityLoader.java:75)
	at org.hibernate.loader.entity.EntityLoader.<init>(EntityLoader.java:43)
	at org.hibernate.loader.entity.EntityLoader.<init>(EntityLoader.java:33)
	at org.hibernate.loader.entity.BatchingEntityLoader.createBatchingEntityLoader(BatchingEntityLoader.java:103)
	at org.hibernate.persister.entity.AbstractEntityPersister.createEntityLoader(AbstractEntityPersister.java:1748)
	at org.hibernate.persister.entity.AbstractEntityPersister.createEntityLoader(AbstractEntityPersister.java:1752)
	at org.hibernate.persister.entity.AbstractEntityPersister.createLoaders(AbstractEntityPersister.java:2984)
	at org.hibernate.persister.entity.AbstractEntityPersister.postInstantiate(AbstractEntityPersister.java:2977)
	at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:290)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1294)
	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:713)
	... 97 more
16:01:03,640 INFO  [JmxKernelAbstraction] creating wrapper delegate for: org.jboss.ejb3.stateless.StatelessContainer
16:01:03,640 INFO  [JmxKernelAbstraction] installing MBean: jboss.j2ee:jar=newtitan.jar,name=ReservationManager,service=EJB3 with dependencies:
16:01:03,640 INFO  [JmxKernelAbstraction] 	persistence.units:jar=newtitan.jar,unitName=titanPU
16:01:03,640 INFO  [EJB3Deployer] Deployed: file:/C:/Programme/JBOSS/jboss-4.2.3.GA-jdk6/jboss-4.2.3.GA/server/default/deploy/newtitan.jar
16:01:03,640 ERROR [URLDeploymentScanner] Incomplete Deployment listing:

--- MBeans waiting for other MBeans ---
ObjectName: persistence.units:jar=newtitan.jar,unitName=titanPU
  State: FAILED
  Reason: javax.persistence.PersistenceException: org.hibernate.HibernateException: cannot simultaneously fetch multiple bags
  I Depend On:
    jboss.jca:service=DataSourceBinding,name=MySqlDS
  Depends On Me:
    jboss.j2ee:jar=newtitan.jar,name=ReservationManager,service=EJB3

ObjectName: jboss.j2ee:jar=newtitan.jar,name=ReservationManager,service=EJB3
  State: NOTYETINSTALLED
  I Depend On:
    persistence.units:jar=newtitan.jar,unitName=titanPU

--- MBEANS THAT ARE THE ROOT CAUSE OF THE PROBLEM ---
ObjectName: persistence.units:jar=newtitan.jar,unitName=titanPU
  State: FAILED
  Reason: javax.persistence.PersistenceException: org.hibernate.HibernateException: cannot simultaneously fetch multiple bags
  I Depend On:
    jboss.jca:service=DataSourceBinding,name=MySqlDS
  Depends On Me:
    jboss.j2ee:jar=newtitan.jar,name=ReservationManager,service=EJB3
```


ist dann aber die antwort von eclipse.


----------



## chr (14. Jun 2009)

Ev hilft dieser Workaround

Eyal Lupu Java Blog >> Hibernate Exception - Simultaneously Fetch Multiple Bags


----------



## maki (14. Jun 2009)

chr hat gesagt.:


> Es sollte möglich sein, bei jeder Annotation einer Beziehung
> 
> @OneToXXX(....fetch=FetchType.EAGER....)
> 
> zu setzen


Das funktioniert höchstens beim testen richtig, in der Praxis bricht die Performance meist so ein, dass es nicht zu gebrauchen ist.
Es gibt einen  guten Grund warum Lazy als Default vorgegeben ist 

Die lösung heisst: Fetch joins

Werden auch in der Hibernate Doku erklärt.


----------



## wakoz (14. Jun 2009)

maki hat gesagt.:


> Das funktioniert höchstens beim testen richtig, in der Praxis bricht die Performance meist so ein, dass es nicht zu gebrauchen ist.
> Es gibt einen  guten Grund warum Lazy als Default vorgegeben ist
> 
> Die lösung heisst: Fetch joins
> ...


hättest du ein code beispiel für mich 

ich fürchte wenn ich es direckt in der doku nachlese kapiere ich es nicht, bzw habe es nicht kapiert. Habe in der letzten stunde mehrere seiten und foren durchsucht leider kein gute erklärung gefunden.


----------



## maki (14. Jun 2009)

Steht doch in der Hibernate Doku aus dem Kapitel über die HQL, unter *11.3. Associations and joins* 
https://www.hibernate.org/hib_docs/nhibernate/html/queryhql.html

Bevor deine Entitäten die Session verlassen, zB. durch serialisierung auf eine andere VM, sollten alle benötigten Attribute (Colelctions. etc.) geladen sein, sonst bekommt du eine Lazy Init Exception.
Das erreicht man mit einer sog. fetch join query, so kann man von Anwendungsfall zu Anwedungsfall unterschieden was geladen werden soll, ohne es im Mapping fest auf eager zu verdrahten.


----------

