models are loaded lazily, eg imodel does not have an attach(), only a
detach(). so unless your link accesses the model - eg invokes
getobject() on it nothing will be loaded. at the end of request all
models should get detach() called.

-igor

On Wed, May 27, 2009 at 2:30 AM, Wilter du Toit <[email protected]> wrote:
> Hi
>
> When I use an AjaxLink and it's onClick event is called, it seems that none
> of the components of the page that the AjaxLink is on has its attach/detach
> model methods called.
> Here is an example (I just made this quickly and roughly in order to
> demonstrate the issue):
>
> -------------
>
> package com.company.web.wicket.pages;
>
> import java.util.List;
>
> import org.apache.wicket.ajax.AjaxRequestTarget;
> import org.apache.wicket.ajax.markup.html.AjaxLink;
> import org.apache.wicket.markup.html.WebMarkupContainer;
> import org.apache.wicket.markup.html.basic.Label;
> import org.apache.wicket.markup.html.list.ListItem;
> import org.apache.wicket.markup.html.list.ListView;
> import org.apache.wicket.model.LoadableDetachableModel;
> import org.apache.wicket.spring.injection.annot.SpringBean;
> import org.hibernate.Session;
> import org.hibernate.SessionFactory;
> import org.slf4j.Logger;
> import org.slf4j.LoggerFactory;
>
> import com.company.web.dao.AccountManager;
> import com.company.web.dao.UsageLogManager;
> import com.company.web.domain.UsageLog;
>
> @SuppressWarnings("serial")
> public class HibernateTestPage extends ExternalPage
> {
>    private static final Logger logger =
> LoggerFactory.getLogger(HibernateTestPage.class);
>
>
>   �...@springbean
>    protected AccountManager accountManager;
>
>   �...@springbean
>    private UsageLogManager usageLogManager;
>
>   �...@springbean
>    private SessionFactory sessionFactory;
>
>    protected class HibernateLoadableDetachableModel extends
> LoadableDetachableModel
>    {
>       �...@override
>        protected Object load()
>        {
>            logger.debug("Loading usageLogs...");
>
>            List<UsageLog> usageLogs =
> usageLogManager.getUsageLogs(accountManager.findById(1));
>
>            return usageLogs;
>        }
>    }
>
>
>    public HibernateTestPage()
>    {
>        final WebMarkupContainer container = new
> WebMarkupContainer("container");
>
>        final ListView listView = new ListView("logsView",new
> HibernateLoadableDetachableModel())
>        {
>           �...@override
>            protected void populateItem(ListItem listItem)
>            {
>
>                final UsageLog usageLog = (UsageLog)
> listItem.getModelObject();
>
>                Session session = sessionFactory.getCurrentSession();
>
>                logger.debug("usageLog in populate item is in hibernate
> session?" + session.contains(usageLog) );
>
>                Label ipAddress = new
> Label("ipAddress",usageLog.getIpAddress());
>                listItem.add(ipAddress);
>
>                Label outcome = new
> Label("outcome",usageLog.getOutcome().toString());
>                listItem.add(outcome);
>
>                Label outcomeMsg = new
> Label("outcomeMsg",usageLog.getOutcomeMsg());
>                listItem.add(outcomeMsg);
>
>                AjaxLink checkLink = new AjaxLink("checkHibernateLink")
>                {
>                   �...@override
>                    public void onClick(AjaxRequestTarget target)
>                    {
>                        Session session =
> sessionFactory.getCurrentSession();
>
>                        logger.debug("usageLog in checkLink is in hibernate
> session?" + session.contains(usageLog) );
>
>
>                    }
>                };
>
>                listItem.add(checkLink);
>            }
>        };
>
>        add(container);
>        container.add(listView);
>
>
>    }
> }
>
> -------------
>
> The output when the page is first accessed prints:
>
> Loading usageLogs...
> usageLog in populate item is in hibernate session? true   # For each item
>
>
> However, When the checkLink is clicked it prints
>
> usageLog in checkLink is in hibernate session? false
>
>
> The logs show that the ListView's model is not loaded when the checkLink is
> clicked.
>
> I always thought that when a page is accessed by a request that all the
> components are told to attach their model at the start of the request. This
> does not seem to be the case. I have read
> all the available request lifecycle documentation I have found but still
> have not found why the model is not loaded for the page's components on an
> AjaxLink click.
>
> Can anyone explain this behavior and maybe give me a bit more detail how the
> request lifecycle and the component model's work together.
>
> If I add target.addComponent(container) in the onClick method of checkLink
> the model for the ListView is loaded and populateItem is called again, with
> printing true for "in hibernate session". But I need to be able to access
> the attached instance of the hibernate object in the AjaxLink's onClick
> method. What is the best way to achieve this?
>
> Thanks
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to