After some twiddling I found that the PagingNavigator seems to be the culprit.
If I leave it out, the session grows only moderately, when I put it in, the
domain objects end up in the session... Anyway here is the code:

public class AuftragUebersicht extends MasterLayout {

  @SpringBean
  private AuftragBA auftragBA;

  public AuftragUebersicht() {
    this.initComponents();
  }

  private void initComponents() {

    final AuftragDataView auftragDataView = new AuftragDataView("resultList",
        new AuftragDataProvider(AuftragUebersicht.this.auftragBA), 10);

    Form form = new Form("searchForm") {

      public Form initComponents() {
        final TextField auftragsnummerField = new TextField("auftragsnummer",
                                                             new Model(""));
        add(auftragsnummerField);

        Button searchButton = new Button("search") {
          public void onSubmit() {
            String auftragsnummer = 
auftragsnummerField.getModelObjectAsString();

            AuftragDataProvider p = (AuftragDataProvider)
                                     auftragDataView.getDataProvider();
            p.setQuery(new AuftragUebersichtQuery(auftragsnummer));

            if (auftragDataView.getDataProvider().size() == 0) {
              AuftragUebersicht.this.info("No results found!");
            }
          }
        };
        add(searchButton);

        return this;
      }

    }.initComponents();

    WebMarkupContainer resultListContainer = new 
WebMarkupContainer("resultListContainer") {
      public boolean isVisible() {
        return auftragDataView.getDataProvider().size() > 0;
      }
    };

    CheckGroup group = new CheckGroup("group", new ArrayList<PartnerAuftrag>());

    group.add(new CheckGroupSelector("groupselector"));

    group.add(auftragDataView);

    resultListContainer.add(new PagingNavigator("navigator", auftragDataView));

    resultListContainer.add(group);

    form.add(resultListContainer);

    this.add(form);

  }
}

public class AuftragDataView extends DataView {

  public AuftragDataView(String id, IDataProvider dataProvider, int 
itemsPerPage) {
    super(id, dataProvider, itemsPerPage);
  }

  @Override
  protected void populateItem(final Item item) {

    final PartnerAuftrag auftrag = (PartnerAuftrag) item.getModelObject();
    item.add(new Label("auftragsnummer", auftrag.getAuftragsnummer()));
    ...

    item.add(new Link("update", new Model(auftrag)) {
      public void onClick() {
        AuftragBearbeiten page = new AuftragBearbeiten((PartnerAuftrag) 
getModelObject());
        setResponsePage(page);
      }
    });

    item.add(new AttributeModifier("class", true, new AbstractReadOnlyModel() {
      public Object getObject() {
        return (item.getIndex() % 2 == 1) ? "even" : "odd";
      }
    }));
  }

  @Override
  protected void onDetach() {
    super.onDetach();
  }
}

public class AuftragDataProvider implements IDataProvider {

  private AuftragBA                  auftragBA;
  private AuftragUebersichtQuery     query;

  private Collection<PartnerAuftrag> result;

  public AuftragDataProvider(AuftragUebersichtQuery query, AuftragBA auftragBA) 
{
    this.query = query;
    this.auftragBA = auftragBA;
  }

  public AuftragUebersichtQuery getQuery() {
    return this.query;
  }

  public void setQuery(AuftragUebersichtQuery query) {
    this.query = query;
    this.result = null;
  }

  public Iterator<PartnerAuftrag> iterator(int first, int count) {
    if (this.result == null) {
      this.performQuery();
    }
    return new ArrayList<PartnerAuftrag>(this.result).subList(first, first + 
count).iterator();
  }

  public IModel model(final Object object) {
    return new DetachablePartnerAuftragModel((PartnerAuftrag) object, 
this.auftragBA);
  }

  public int size() {
    if (this.result == null) {
      this.performQuery();
    }
    return this.result.size();
  }

  public void detach() {
    this.result = null;
  }

  private void performQuery() {
    ...
  }
}


public class DetachablePartnerAuftragModel extends LoadableDetachableModel {

  private Long      id;
  private AuftragBA auftragBA;

  public DetachablePartnerAuftragModel(PartnerAuftrag auftrag, AuftragBA 
auftragBA) {
    this(auftrag.getAuftragsId(), auftragBA);
  }

  public DetachablePartnerAuftragModel(Long id, AuftragBA auftragBA) {
    this.id = id;
    this.auftragBA = auftragBA;
  }

  @Override
  protected Object load() {
    return this.auftragBA.findAuftragByAuftragsId(this.id);
  }

  @Override
  protected void onDetach() {
    super.onDetach();
  }
}

Michael Sparer wrote:
> the objects shouldn't be serialized into the session if you're using
> loadabledetachable models, please show us some code
>
> regards,
> Michael
>
>
> Jürgen Lind-2 wrote:
>> Hi,
>>
>> I have a question on how the DataView component is supposed to work. In my
>> application, I have to show quite large list of entities and so I am using
>> a DataView together with LoadableDetachableModels to read the data on
>> demand.
>> However, when looking at the serialized sessions, I can observe that the
>> session size constantly increases by a fairly large amount although I am
>> just using the navigator to page through the list. Also, when looking into
>> the serialized session, I can see that the objects that are supposed to
>> be reloaded on demand are serialized into the session as well.
>>
>> Is this the behavior that I would expect from the DataView or am I making
>> some mistake here?
>>
>> Regards,
>>
>> J.
>>
>> --
>> Dr. Jürgen Lind
>> iteratec GmbH                Fon: +49 (0)89 614551-44
>> Inselkammerstrasse 4         Fax: +49 (0)89 614551-10
>> 82008 Unterhaching           Web: www.iteratec.de
>>
>> Sitz und Registergericht der iteratec GmbH: München HRB 113 519
>> Geschäftsführer: Klaus Eberhardt, Mark Goerke, Inge Hanschke, Ralf Menzel
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
>> For additional commands, e-mail: users-h...@wicket.apache.org
>>
>>
>>
>
>
> -----
> Michael Sparer
> http://talk-on-tech.blogspot.com

--
Mit freundlichen Grüßen,

Jürgen Lind

--
Dr. Jürgen Lind
iteratec GmbH                Fon: +49 (0)89 614551-44
Inselkammerstrasse 4         Fax: +49 (0)89 614551-10
82008 Unterhaching           Web: www.iteratec.de

Sitz und Registergericht der iteratec GmbH: München HRB 113 519
Geschäftsführer: Klaus Eberhardt, Mark Goerke, Inge Hanschke, Ralf Menzel


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org

Reply via email to