hibernate 3 also has the sessionfactory.currentsession that lets you hook into the filter's session threadlocal so that your daos can just go sessionfactory.currentsession().
also spring takes care of all this for you via open session in view filter. im sure there is something similar for ejb3.
-Igor
On 4/11/06,
Vincent Jenks <[EMAIL PROTECTED]> wrote:
Ugh...I thought once I started using a container this issue would go
away...that was the one thing that made setting up Hibernate a
PITA....managing the frickin' session context (I thought it was really
ugly to open the session in the DAO and close it in a filter...with no
real control over the transaction.)
Marco, what do you mean by "preloading" the collections? Not a term
I've heard before...not familiar w/ the concept - it sounds a little
like eager fetching. Or, is that to say that you fetch them
separately instead of allowing hibernate/EJB3 to automatically pull
the collection?
I'll just use eager fetching for now and see if someone can help me
out on the EJB3 user forums in figuring out the session problem. I've
been scanning over the EntityManager docs for a couple hours and I
don't see an obvious solution.
Thanks guys!
On 4/11/06, Marco Geier <[EMAIL PROTECTED] > wrote:
> you could wrap a transaction around the render phase)
> (and also around the event processing phase, or both, depending on your
> RenderStrategy)
>
> The key is:
>
> UserTransaction ut = (UserTransaction) new
> InitialContext().lookup("java:comp/UserTransaction");
>
> But you may need to reattach beans to the session, for the lazy
> collection thing to work properly.
>
> But ususally i just "preload" the collections, for example when i build
> or attach the model,
>
> hth
>
> Marco
>
> Vincent Jenks wrote:
> > Yes...if I were using plain Hibernate and not EJB3...like I explained
> > in my first post. I need another way of making this work (as Igor
> > said...a way to keep the session open somehow in the container) - a
> > way that wouldn't require any Hibernate-specific coding...
> >
> > I've built several plain Hibernate (Hibernate + Servlets + EJB) where
> > the DAOs would open the transaction and a filter would close the
> > session...but that doesn't apply so much here, if I'm not mistaken.
> >
> > On 4/11/06, Andrew Berman < [EMAIL PROTECTED]> wrote:
> >
> >>You need Open Session In View -->
> >>http://www.hibernate.org/43.html
> >>
> >>
> >>On 4/11/06, Igor Vaynberg < [EMAIL PROTECTED]> wrote:
> >>
> >>>in that case your container's persistence mechanism is closing the
> >>
> >>underlying hibernate session after the end of the invocation? this is a
> >>container specific problem not a wicket one. you need to figure out how to
> >>tell your container to keep the underlying entity manager session open so
> >>that lazy collections can be fetched even outside the session/stateless
> >>bean's method invocation.
> >>
> >>>
> >>>-Igor
> >>>
> >>>
> >>>
> >>>On 4/11/06, Vincent Jenks < [EMAIL PROTECTED]> wrote:
> >>>
> >>>>I changed the param to look like yours:
> >>>>
> >>>>new PropertyModel(blogModel, "categories")
> >>>>
> >>>>...and I get the same exception...no luck!
> >>>>
> >>>>On 4/11/06, Igor Vaynberg < [EMAIL PROTECTED]> wrote:
> >>>>
> >>>>>you are still not using a model for the listview, you are binding the
> >>>>>listview to hibernate's lazy initializable set instead in this line:
> >>>>>
> >>>>>
> >>>>>add(new ListView("categoriesView", ((Blog)getModelObject())
> >>>>> .getCategories())
> >>>>>
> >>>>>try changing that to:
> >>>>>
> >>>>>add(new ListView("categoriesView", new PropertyModel(blogModel,
> >>>>>"categories"));
> >>>>>
> >>>>>or create a simple wrapper around blogmodel directly if you dont want
> >>
> >>to use
> >>
> >>>>>"soft binding" and reflection.
> >>>>>
> >>>>>-Igor
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>On 4/11/06, Vincent Jenks < [EMAIL PROTECTED]> wrote:
> >>>>>
> >>>>> OK, this doesn't appear to work. I finally got around to testing
> >>
> >>this
> >>
> >>>>>and I still get a
> >>>>>LazyInitializationException.
> >>>>>
> >>>>>I passed the model around and it's barfing.
> >>>>>
> >>>>>"main" page (ViewBlog.class):
> >>>>>
> >>>>> //get object graph in detachable model
> >>>>> IModel blogModel = new LoadableDetachableModel()
> >>>>> {
> >>>>> protected Object load()
> >>>>> {
> >>>>> //get blog & entries
> >>>>> Blog blog =
> >>>>>BlogProxy.getDefault ();
> >>>>> return blog;
> >>>>> }
> >>>>> };
> >>>>>
> >>>>> //set as page model
> >>>>> setModel(blogModel);
> >>>>>
> >>>>> //add panel components
> >>>>> add(new TopicsPanel("topicsPanel", blogModel));
> >>>>>
> >>>>>In the TopicsPanel class:
> >>>>>
> >>>>>public class TopicsPanel extends Panel
> >>>>>{
> >>>>> public TopicsPanel(String id, IModel blogModel)
> >>>>> {
> >>>>> super(id, blogModel);
> >>>>>
> >>>>> //get model object
> >>>>> Blog blog = (Blog)getModelObject();
> >>>>>
> >>>>> //add list view repeater
> >>>>> add(new ListView("categoriesView",
> >>>>>((Blog)getModelObject()).getCategories())
> >>>>> {
> >>>>> protected void
> >>>>>populateItem(ListItem item)
> >>>>> {
> >>>>> //get row model
> >>>>> final Category
> >>
> >>category =
> >>
> >>>>>(Category)item.getModelObject();
> >>>>>
> >>>>> //create link
> >>>>> Link categoryLink =
> >>
> >>new
> >>
> >>>>>PageLink("categoryLink", ViewBlog.class)
> >>>>> {
> >>>>> public void
> >>>>>onClick()
> >>>>> {
> >>>>>
> >>>>>info("booyah!");
> >>>>> }
> >>>>> };
> >>>>>
> >>>>> //add category name
> >>
> >>label
> >>
> >>>>> categoryLink.add(new
> >>>>>Label("topic", category.getName ()));
> >>>>>
> >>>>> //add link
> >>>>>
> >>
> >>item.add(categoryLink);
> >>
> >>>>> }
> >>>>> });
> >>>>> }
> >>>>>}
> >>>>>
> >>>>>Where I'm trying to retrive the lazy collection in the ListView the
> >>>>>session has still been lost.
> >>>>>
> >>>>>What have I done wrong? How can I get the lazily loaded collection
> >>>>>and not have to resort to eager fetching?
> >>>>>
> >>>>>Remember, I'm not using Hibernate directly...I'm using JBoss EJB3 in
> >>>>>JBoss 4.0.4RC1...I don't have a lot of control over Hibernate...no do
> >>>>>I want to if I want to keep my project container-independent.
> >>>>>
> >>>>>Thanks!
> >>>>>
> >>>>>On 3/20/06, Igor Vaynberg <[EMAIL PROTECTED]> wrote:
> >>>>>
> >>>>>>or pass the same model :)
> >>>>>>
> >>>>>>
> >>>>>>-Igor
> >>>>>>
> >>>>>>
> >>>>>
> >>>>> >
> >>>>>
> >>>>>>On 3/20/06, Vincent Jenks <[EMAIL PROTECTED] > wrote:
> >>>>>>
> >>>>>>>Well, in the previous page which passes the Product into this
> >>
> >>page...the
> >>
> >>>>>object was wrapped in a detachable model...not just called
> >>
> >>directly...so I
> >>
> >>>>>should try and wrap it again in the current page?
> >>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>> On 3/20/06, Igor Vaynberg < [EMAIL PROTECTED]> wrote:
> >>>>>>>
> >>>>>>>>instead of using the product object directly, use a detachable
> >>
> >>model.
> >>
> >>>>>>>>you might also need to use an open session in view interceptor
> >>
> >>in case
> >>
> >>>>>jboss closes the hibernate session after your bean's method is
> >>
> >>finished
> >>
> >>>>>executing. if it does this, then by the time wicket code runs the
> >>
> >>object is
> >>
> >>>>>already disconnected from its session and thus cant load any child
> >>>>>collections.
> >>>>>
> >>>>>>>>
> >>>>>>>>-Igor
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>On 3/20/06, Vincent Jenks < [EMAIL PROTECTED] > wrote:
> >>>>>>>>
> >>>>>>>>>OK, so I'm in a bit of a quagmire.
> >>>>>>>>>
> >>>>>>>>>I'm using Wicket + EJB3 (JBoss 4.0.4RC1) which uses Hibernate
> >>
> >>as the
> >>
> >>>>>persistence behind EJB3.
> >>>>>
> >>>>>>>>>Unless I set all of my parent/child object relationship
> >>
> >>annotations
> >>
> >>>>>to EAGER fetching...I get this error:
> >>>>>
> >>>>>>>>>"org.hibernate.LazyInitializationException :
> >>
> >>failed
> >>
> >>>>>to lazily initialize a collection of role:...."
> >>>>>
> >>>>>>>>>...when I try to access the child collection of the parent
> >>
> >>object.
> >>
> >>>>>In my case, for example, I am passing an object to a form in Wicket
> >>
> >>using
> >>
> >>>>>the constructor:
> >>>>>
> >>>>>>>>>public class ProductDetail extends WebPage
> >>>>>>>>>{
> >>>>>>>>> public ProductDetail()
> >>>>>>>>> {
> >>>>>>>>> this(null);
> >>>>>>>>> }
> >>>>>>>>>
> >>>>>>>>> public ProductDetail(Product product)
> >>>>>>>>> {
> >>>>>>>>> add(new
> >>>>>
> >>>>>ProductDetailForm("productDetailForm", product));
> >>>>>
> >>>>>>>>>...
> >>>>>>>>>
> >>>>>>>>>The parent object being "Product" and the child being
> >>>>>
> >>>>>Product.getConfigurations ()....which is a List<Configuration>.
> >>>>>
> >>>>>>>>>This same ProductDetail page has a form (see above where I
> >>
> >>passed
> >>
> >>>>>the Product into the form)...and I need to access the child collection
> >>>>>inside the form:
> >>>>>
> >>>>>>>>> add(new ListView("configs",
> >>
> >>product.getConfigurations())
> >>
> >>>>>>>>> {
> >>>>>>>>> protected void populateItem(ListItem item)
> >>>>>>>>> {
> >>>>>>>>> final Configuration config =
> >>>>>
> >>>>>(Configuration)item.getModelObject();
> >>>>>
> >>>>>>>>> item.add(new Label("quantity",
> >>>>>
> >>>>>String.valueOf(config.getQuantity ())));
> >>>>>
> >>>>>>>>> item.add(new Label("name",
> >>
> >>config.getName()));
> >>
> >>>>>>>>> item.add(new Label("weight",
> >>>>>
> >>>>>config.getWeight()));
> >>>>>
> >>>>>>>>> item.add(new Label("price",
> >>
> >>String.valueOf(
> >>
> >>>>>config.getPrice())));
> >>>>>
> >>>>>>>>> }
> >>>>>>>>> });
> >>>>>>>>>
> >>>>>>>>>badda-bing...here's when the exception occurs. Now...I
> >>
> >>*could* fix
> >>
> >>>>>it by setting the collection to EAGER fetching...but this could
> >>
> >>eventually
> >>
> >>>>>cause me some severe performance problems....especially once the
> >>
> >>collections
> >>
> >>>>>begin to grow in size...I just have to be able to do LAZY fetching.
> >>>>>
> >>>>>>>>>Since I'm using EJB3 CMP I don't have control over the
> >>
> >>hibernate
> >>
> >>>>>session - the container does...so my flexibility there is limited. Is
> >>
> >>there
> >>
> >>>>>something I could do to work around this?
> >>>>>
> >>>>>>>>>Thanks!
> >>>>>>>>>
> >>>>>>>>
> >>>>>>>>
> >>>>>>>
> >>>>>>
> >>>>>
> >>>>>
> >>-------------------------------------------------------
> >>
> >>>>>This SF.Net email is sponsored by xPML, a groundbreaking scripting
> >>
> >>language
> >>
> >>>>>that extends applications into web and mobile media. Attend the live
> >>
> >>webcast
> >>
> >>>>>and join the prime developer group breaking into this new coding
> >>
> >>territory!
> >>
> >> http://sel.as-us.falkag.net/sel?cmdlnk&kid0944&bid$1720&dat1642
> >>
> >>>>>_______________________________________________
> >>>>>Wicket-user mailing list
> >>>>>Wicket-user@lists.sourceforge.net
> >>>>>
> >>
> >> https://lists.sourceforge.net/lists/listinfo/wicket-user
> >>
> >>>>>
> >>>>
> >>>>-------------------------------------------------------
> >>>>This SF.Net email is sponsored by xPML, a groundbreaking scripting
> >>
> >>language
> >>
> >>>>that extends applications into web and mobile media. Attend the live
> >>
> >>webcast
> >>
> >>>>and join the prime developer group breaking into this new coding
> >>
> >>territory!
> >>
> >> http://sel.as-us.falkag.net/sel?cmdlnk&kid0944&bid$1720&dat1642
> >>
> >>>>_______________________________________________
> >>>>Wicket-user mailing list
> >>>>Wicket-user@lists.sourceforge.net
> >>>>
> >>
> >> https://lists.sourceforge.net/lists/listinfo/wicket-user
> >>
> >>>
> >>
> >
> >
> > -------------------------------------------------------
> > This SF.Net email is sponsored by xPML, a groundbreaking scripting language
> > that extends applications into web and mobile media. Attend the live webcast
> > and join the prime developer group breaking into this new coding territory!
> > http://sel.as-us.falkag.net/sel?cmd=k&kid0944&bid$1720&dat1642
> > _______________________________________________
> > Wicket-user mailing list
> > Wicket-user@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/wicket-user
> >
> >
>
> --
> ___________________________
>
> Dipl.-Ing. Marco Geier
> EyeTea GmbH
> Germany
> phone +49 (0)721 662464-0
> fax +49 (0)721 662464-1
> mobile +49 (0)177 6579590
> [EMAIL PROTECTED]
>
>
> -------------------------------------------------------
> This SF.Net email is sponsored by xPML, a groundbreaking scripting language
> that extends applications into web and mobile media. Attend the live webcast
> and join the prime developer group breaking into this new coding territory!
> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
> _______________________________________________
> Wicket-user mailing list
> Wicket-user@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/wicket-user
>
-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmdlnk&kid0944&bid$1720&dat1642
_______________________________________________
Wicket-user mailing list
Wicket-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/wicket-user