Yes, copying entities from the entity's association collection into another
collection will initialize the collection. If you're still getting an LIE,
there may be another association at play (a child of Phone?).

Note that I don't fully endorse the session reattachment aspect I posted.
Not only is weaving those Hibernate classes a little tricky and a lot of
hacky, it can cause undesirable amounts of entities to be added into the
session. James' suggestion of putting the collection behind a Wicket model
is more elegant. To this end, you might develop a utility which, given a
list of Persons, returns an IModel<List<Person>> while storing only their
IDs in the session. In the following code, BasicDao.getIdentifier() and
BasicDao.get() simply map to Hibernate Session methods of the same name for
entity class T.

public static <T> IModel<List<T>> createListModelFromObjects(final
BasicDao<T> dao, List<T> objectList) {
final List<Serializable> idList = new
ArrayList<Serializable>(objectList.size());
for (T object : objectList) {
idList.add(dao.getIdentifier(object));
}
 return new LoadableDetachableModel<List<T>>(objectList) {
@Override
protected List<T> load() {
return loadList(dao, idList);
}
};
}

private static <T> List<T> loadList(BasicDao<T> dao, List<? extends
Serializable> idList) {
List<T> loadList = new ArrayList<T>(idList.size());
for (Serializable id : idList) {
loadList.add(dao.get(id));
}
return loadList;
}


On Wed, Dec 1, 2010 at 10:26 PM, Nivedan Nadaraj <shravann...@gmail.com>wrote:

> Hi Dan,
>
> Thanks for your time most appreciated.
>
> 1. Option 1 as you may agree, not always is a good thing to do so I would
> drop that.
>
> 2. Option 2 - I have tried this in the following manner.
>
> As part of the look up for the Subjects via the DAO, I iterate through the
> list of Person.Phones collection and assign them into a Collection<Phones>
> and set it into a value Object with has a List. This is because i cannot
> use
> the Set in the PageableListView. In doing so, I have forced the entities in
> the collection/proxy to be intialised isn't it? Looks like even with this
> it
> beats me.
>
> 3. Option 3 - I have to read up more on how I can use this code/or
> something
> similar, we use Spring for DI.
>
> Further, each time I want to view a Person detail, I do a second look up
> when the user clicks from a list of Persons. I send issue a lookup into the
> DAO to get the Person's details afresh(the exact same method I used to list
> all Subjects in the first place), so this again would have refreshed the
> Phones collection on the Person in context.
>
> I will try to track it down I guess it has to do with session anyway. I
> also
> use the CPM to hold the Model for the whole page. Not a LDM.
>
> Thanks again for the time
> Cheers
> Niv
>
>
> On Thu, Dec 2, 2010 at 1:47 PM, Dan Retzlaff <dretzl...@gmail.com> wrote:
>
> > Hi Nivedan,
> >
> > Even though the subsequent requests have a Session open, the entities
> with
> > the uninitialized collections don't know about it. I'm sure if you track
> it
> > down, you can explain the "intermittent" behavior by prior access to the
> > collection when the original session is open.
> >
> > I'd say you can either (1) configure Hibernate to load the collections to
> > load unlazily, (2) manually access the collections to force them to
> > initialize in the specific cases you're encountering LIEs, or (3) employ
> > some kind of AOP hack to reinject the new session right before the
> > collection is accessed. They're all kind of ugly, and I've never heard of
> > anyone else doing the last, but it's been working well for my team.
> >
> > For your reference, here is the AspectJ aspect I wrote. (We use Guice for
> > dependency injection.)
> >
> > /**
> >  * Reattaches entities whose lazy collections are about to be initialized
> >  * <p>
> >  * Can we keep track of all lazy relationships that get initialized, and
> >  * uninitialize them at the end of the request? This would prevent
> > referenced
> >  * entities from being serialized and replicated (unless separate
> > references
> >  * were created to them).
> >  *
> >  * @author dan
> >  */
> > @Aspect
> > public class ReattachAspect {
> > private static final Logger LOG = Logger.getLogger(ReattachAspect.class);
> >
> > private Provider<Session> sessionProvider;
> >
> > @Before("call(public final void
> > org.hibernate.proxy.AbstractLazyInitializer.initialize()) &&
> > target(initializer)")
> > public void reattachLazyInitializer(LazyInitializer initializer) {
> > if (initializer.getSession() == null && sessionProvider != null) {
> > if (LOG.isDebugEnabled()) {
> > LOG.debug("reattaching session to lazy initializer for " +
> > initializer.getEntityName());
> > }
> > Session session = sessionProvider.get();
> > initializer.setSession((SessionImplementor) session);
> > }
> > }
> >
> > @Before("call(private void
> > org.hibernate.collection.AbstractPersistentCollection"
> > + ".throwLazyInitializationExceptionIfNotConnected()) &&
> > target(collection)")
> > public void reattachPersistentCollection(PersistentCollection collection)
> {
> > SessionImplementor session = ((AbstractPersistentCollection)
> > collection).getSession();
> > if ((session == null || !session.isOpen()) && sessionProvider != null) {
> > if (LOG.isDebugEnabled()) {
> > LOG.debug("reattaching session to collection");
> > }
> >
> > session = (SessionImplementor) sessionProvider.get();
> > CollectionPersister persister =
> > session.getFactory().getCollectionPersister(collection.getRole());
> >
> > collection.setCurrentSession(session);
> >
> session.getPersistenceContext().addInitializedDetachedCollection(persister,
> > collection);
> > }
> > }
> >
> > @Inject
> > public void setSessionProvider(Provider<Session> sessionProvider) {
> > this.sessionProvider = sessionProvider;
> > }
> > }
> >
> >
> > On Wed, Dec 1, 2010 at 9:23 PM, Nivedan Nadaraj <shravann...@gmail.com
> > >wrote:
> >
> > > Hi All
> > >
> > > I am guessing this is more of a Hibernate thing/issue but if some one
> has
> > > encountered this and has a explanation that I can probably use from the
> > > Wicket front would be great.
> > >
> > > https://forum.hibernate.org/viewtopic.php?f=1&t=1008473
> > >
> > >
> > > I have a LazyIntializationException when i page through some items. I
> use
> > > the PageableListView, the List item(s) are entities that are retrieved
> > via
> > > an association Person.phones which is  a Set type.
> > > The funny thing is, the LIException is intermittent. I am also using
> > > OpenSessionInViewFilter. Any thoughts?
> > >
> > > By the way the this is the load() implemenation, I have set the Model
> > > Object's phoneList with a list of values fetched via the Service->DAO.
> I
> > > have used this with other entities without association and it works
>  but
> > I
> > > guess is a different scenario(not associations)
> > >
> > > Model = new LoadableDetachableModel<Object>() {
> > >    @Override
> > >            protected Object load() {
> > >                return containerForm.getModelObject().getPhoneList();
> > >            }
> > >        };
> > > }
> > >
> > > If someone has any thoughts would appreiciate hearing from you.
> > >
> > >
> > > Cheers
> > >
> >
>

Reply via email to