Today I have struggled half a day with a frustrating problem.
I have a ManyToMany-relationship (JPA) with two Entities. Shop and Brand, it's also bidirectional.
Hibernate and Spring-veterans sees where I'm going with this...
If I want to get a Object of Shop from the database, everythings simple. But if I want to get the attribute that's the "ManyToMany" (in this case "Brand") I would get it as a form of Collection.
But here's the kicker: Hibernate has a lazy initialization of these kinds of collections. This is for saving a lot of data loading for every time you get a Shop-object from the database.
I wanted to have a JSF-form with my data and the possibility to update it (specifically the Brands). I wanted to use the selectManyCheckBox component in JSF.
So the Hell began here.
The specific exception I got was (I also got the role-error earlier):
javax.servlet.ServletException: failed to lazily initialize a collection, could not initialize proxy - no Session
You can set the annotation of the ManyToMany to suggest "EARLY" so that it loads all the collection-data with the regular.
And that solution didn't solve my problems. It feels like I almost tried every solution known to man to solve this problem. I did beans that sole purpose was to get the Brands as a list from the Shop and try to merge it with the data in the form and the update-bean.
Of course I tried to google solutions. 95% of the links led me to thinking it was the classic lazy-problem that the Hibernate-session closed before I got my collection data.
But something wasn't right. Because I actually got the data to show in the form correctly quite early. It was the update that caused the problem.
The update was a bean that held the data from the JSF-component, they were connected.
But why did a lazy-error show when it wasn't supposed to load the data but actually update it?
I tried View filter (Open View in Session-pattern), I tried Stateful beans with EXTEND persistance unit.
After half a day I stumble to Hatim Alimam's blog were he had the same problem (but with Primeface implementation).
http://blog.hatemalimam.com/hibernate-lazyinitializationexception-and-pselectcheckboxmenu/
It was a little <f:attribute> that was needed!
If I just put <f:attribute name="collectionType" value="java.util.ArrayList" /> in the <f:selectManyCheckBox> Everything worked!
So it wasn't really the classic Lazy-problem, but with that Exception-message, one might think so...
So I hope anyone that has the same problem I had either stumble to this blog or Hatim's.
Cheers!
No comments:
Post a Comment