# Spring Application mit Hessian Remote-Zugriff



## lumpiscore (2. Mai 2010)

Hallo Zusammen

Ich bin am erstellen einer Client-Server Anwendung und bin dabei noch auf ein Problem gestossen. Zur Umgebung; Client JavaFx der mittels Hessian auf den Server (Spring Tomcat) zugreift. Auf der Server-Seite wird Hibernate mit JPA als persistence-Provider eingesetzt. Nun habe ich Probleme beim Laden einer Entität über einen Hessian-Service - genau liegt es beim Laden einer Collection von Child-Records einer Entität. ???:L

Ich habe folgende OneToMany-Relation auf der zu ladenden Entität:


```
@OneToMany(fetch = FetchType.EAGER, targetEntity = Item.class, mappedBy = "_itemHeadId")
	private Collection<Item> _headItems = new HashSet<Item>();
```

Den Service gemäss applicationContext.xml ist wie folgt definiert: 

<bean id="TestService" class="org.springframework.remoting.caucho.HessianServiceExporter" 
	
	
	
	





```
scope="session"> 
        <property name="service" ref="testService" />
        <property name="serviceInterface" value="Application.BaseData.BusinessProcess.ITestService" /> 
    </bean>
```

Wenn ich nun vom Client diesen Service aufrufe und dort ein Query auf der Entität HEAD ausführe erhalte ich auf Client-Seite folgende Fehlermeldung: 


```
2010-05-02 17:36:31,412 [main] ERROR - failed to lazily initialize a collection, no session or session was closed
0org.hibernate.LazyInitializationException: failed to lazily initialize a collection, no session or session was closed
	at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)
	at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:372)
	at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:365)
	at org.hibernate.collection.AbstractPersistentCollection.write(AbstractPersistentCollection.java:205)
	at org.hibernate.collection.PersistentBag.add(PersistentBag.java:297)
	at com.caucho.hessian.io.CollectionDeserializer.readList(CollectionDeserializer.java:78)
	at com.caucho.hessian.io.HessianInput.readObject(HessianInput.java:1043)
	at com.caucho.hessian.io.JavaDeserializer$ObjectFieldDeserializer.deserialize(JavaDeserializer.java:383)
	at com.caucho.hessian.io.JavaDeserializer.readMap(JavaDeserializer.java:199)
	at com.caucho.hessian.io.JavaDeserializer.readMap(JavaDeserializer.java:141)
	at com.caucho.hessian.io.HessianInput.readObject(HessianInput.java:1030)
	at com.caucho.hessian.client.HessianProxy.invoke(HessianProxy.java:201)
	at $Proxy0.queryHeadByHeadId(Unknown Source)
	at ch.bizWare.client.SampleClient.main(SampleClient.java:51)
Exception in thread "main" com.caucho.hessian.client.HessianRuntimeException: com.caucho.hessian.io.HessianFieldException: ch.bizWare.Core.Domain.BaseData.Head._headItems: java.util.Collection cannot be assigned from null
	at com.caucho.hessian.client.HessianProxy.invoke(HessianProxy.java:213)
	at $Proxy0.queryHeadByHeadId(Unknown Source)
	at ch.bizWare.client.SampleClient.main(SampleClient.java:51)
Caused by: com.caucho.hessian.io.HessianFieldException: ch.bizWare.Core.Domain.BaseData.Head._headItems: java.util.Collection cannot be assigned from null
	at com.caucho.hessian.io.JavaDeserializer.logDeserializeError(JavaDeserializer.java:592)
	at com.caucho.hessian.io.JavaDeserializer$ObjectFieldDeserializer.deserialize(JavaDeserializer.java:387)
	at com.caucho.hessian.io.JavaDeserializer.readMap(JavaDeserializer.java:199)
	at com.caucho.hessian.io.JavaDeserializer.readMap(JavaDeserializer.java:141)
	at com.caucho.hessian.io.HessianInput.readObject(HessianInput.java:1030)
	at com.caucho.hessian.client.HessianProxy.invoke(HessianProxy.java:201)
	... 2 more
Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection, no session or session was closed
	at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)
	at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:372)
	at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:365)
	at org.hibernate.collection.AbstractPersistentCollection.write(AbstractPersistentCollection.java:205)
	at org.hibernate.collection.PersistentBag.add(PersistentBag.java:297)
	at com.caucho.hessian.io.CollectionDeserializer.readList(CollectionDeserializer.java:78)
	at com.caucho.hessian.io.HessianInput.readObject(HessianInput.java:1043)
	at com.caucho.hessian.io.JavaDeserializer$ObjectFieldDeserializer.deserialize(JavaDeserializer.java:383)
	... 6 more
```

Grundsätzlich ist mir klar warum dieser Fehler entsteht, nur wie ich diesen beheben kann ist mir nicht klar. Weil die Relation auf Fetch= FetchType.EAGER eingestellt ist, werden grundsätzlich beim Laden der Entität alle Child-records auch mitgeladen. Dies sehe ich auch beim Debuggen der Server-Seite. Jedoch sobald hessian mit der Serialisierung beginnt, fliegt mir die Kiste um die Ohren. ;(

Hoffe es hat jemand von Euch eine Idee wie ich das lösen kann. 

Danke 

Lumpiscore


----------



## FArt (3. Mai 2010)

Tipp: access jpa remote - Google-Suche


----------



## lumpiscore (3. Mai 2010)

Hallo FArt

Vielen herzlichen Dank für Deine Antwort. Grundsätzlich sind mir die möglichen Umgehungsvarianten nun klar. Was mir jedoch nicht klar ist, warum Hessian beim Serialisieren nochmals die Daten laden möchte, obwohl ich die OneToMany-Relation bereits auf EAGER-FetchType festgelegt habe? Weil wenn ich das geladene Entity-Objekt auf dem Service anschaue ist die ontToMany Relation bereits geladen. Warum jedoch beim Serialisieren dieser nochmals ausgeführt wird, verstehe ich nicht. 
Hast Du hierzu ggf. eine Idee? 

Vielen herzlichen Dank

cheers,
lumpiscore


----------



## maki (3. Mai 2010)

Ein fetch join hilft bei lazy init exceptions 

Lass dir mal das generierte SQL ausgeben, wäre nicht das erste mal das Hibernate etwas flexibel mit dem festgelegten Fetch Type umgeht, aber fetch joins sind der bessere, saubere Weg.


----------



## lumpiscore (4. Mai 2010)

Hallo Zusammen

vielen herzlichen Dank für's Feedback. 

Das Problem(mein Problem) ist sehr simpel zu lösen, jedoch muss man zuerst daruf kommen. :rtfm:

Falls jemand auch das Problem mit EAGER-Fetch und Collections im Zusammenhang mit Hessian haben sollte hier noch die Lösung welche bei mir funktioniert hat: 

Einfach das hibernate.jar aus dem Client entfernen. Da ich zu Testzwecken auf meinem Client-Projekt das Server-Projekt eingebunden hatte, habe ich dies nicht bemerkt... 

Grund dafür ist, dass hessian sämtliche Collections mittels "collection accessor" Methoden anspricht und durch das auf der Client-Seite versucht eine Hibernate Collection zu erstellen. Wird das hibernate.jar entfernt findet Hessian die spezifische Collection nicht im Classpath und durch das wird eine "Standard"-Collection verwendet. 

Evtl. ist ja diese Ausführung mal noch wichtig für jemanden.

Vielen Dank für Eure wichtigen Hinweise. 

cheers,

lumpiscore


----------

