Daten mit j2ee aus datenbank abfragen

Status
Nicht offen für weitere Antworten.

wakoz

Aktives Mitglied
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:
Code:
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.

Code:
	@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
Code:
	@OneToMany(cascade = CascadeType.ALL)
	@JoinColumn(name = "customerId")
	public List<Reservation> getReservations() {
		return reservations;
	}

	public void setReservations(List<Reservation> reservations) {
		this.reservations = reservations;
	}
 
Stell den Typ des fetching beim Mapping der Beziehung auf EAGER ein

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

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😳
 
Es sollte möglich sein, bei jeder Annotation einer Beziehung

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

zu setzen
 
Code:
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.
 
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.
 
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.
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.
 
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.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben