Are you always retrieving the entire list?

On Thu, Nov 5, 2009 at 11:25 PM,  <b...@actrix.gen.nz> wrote:
> Igor,
>
> Creating the list of entities exclusively inside iterator() requires
> two database calls for retrieving a list for a single request, the
> additional call being required for the size() method that is called
> prior to iterator(). That is an unfortunate side effect of this API.
>
> I don't have a problem with that as I work around it, as others have
> done before me, by fetching the data eagerly with the size() method
> and then caching it in a volatile field for use by iterator().
>
> I just can't afford to make two database calls.
>
> So I wonder, what is the situation with SerializableChecker
> complaining about that volatile field not being Serializable. Is this
> a bug or do I miss anything?
>
> Should I use something else instead of IDataProvider?
>
> Many thanks.
>
> Bernard
>
>
> On Thu, 5 Nov 2009 20:05:37 -0800, you wrote:
>
>>you should create the list of entities inside iterator() call, not
>>hold on to it in a field. see the phonebook example.
>>
>>-igor
>>
>>On Thu, Nov 5, 2009 at 7:06 PM,  <b...@actrix.gen.nz> wrote:
>>> Thanks again Igor.
>>>
>>> I have switched to plain IDataProvider as suggested, although I have
>>> to admit that I still have to look at the phonebook example.
>>>
>>> Again, IDataProvider is an improvement, but still not good.
>>>
>>> It appears that SerializableChecker is complaining about a volatile
>>> field not being Serializable. Is this a bug or do I miss anything?
>>>
>>> I think that SerializableChecker is a wondeful tool, that is why I am
>>> persevering:
>>>
>>> org.apache.wicket.util.io.SerializableChecker$WicketNotSerializableException:
>>> Unable to serialize class: MyEntity
>>>
>>> ...
>>> private volatile java.util.List MyEntityDataProvider.entities
>>> [class=java.util.Vector]
>>>
>>> ...
>>>
>>>
>>> public class MyEntityDataProvider implements IDataProvider<MyEntity>{
>>>
>>>    private final Integer searchId;
>>>    private volatile List<MyEntity> entities;
>>>
>>>    public MyEntityDataProvider(Integer searchId) {
>>>        this(searchId, null);
>>>    }
>>>
>>>    public MyEntityDataProvider(Integer searchId, List<MyEntity>
>>> entities) {
>>>        this.searchId = searchId;
>>>        this.entities = entities;
>>>    }
>>>
>>>   �...@override
>>>    public Iterator<MyEntity> iterator(int first, int count)
>>>    {
>>>        return entities.iterator();
>>>    }
>>>
>>>   �...@override
>>>    public int size()
>>>    {
>>>        if(this.entities == null){
>>>            SessionLocal sessionBean = MyApplication.getSessionBean();
>>>            this.entities = sessionBean.getMyEntities(this.searchId);
>>>        }
>>>        return this.entities.size();
>>>    }
>>>
>>>   �...@override
>>>    public IModel<MyEntity> model(MyEntity entity)
>>>    {
>>>        return new DetachableMyEntityModel(entity);
>>>    }
>>>
>>>   �...@override
>>>    public void detach()
>>>    {
>>>    }
>>>
>>> }
>>>
>>>
>>>
>>>
>>> On Thu, 5 Nov 2009 18:30:20 -0800, you wrote:
>>>
>>>>no, you should not be using listdataprovider, it is only for static
>>>>lists of things.
>>>>
>>>>if you want best practice look at the phonebook example in wicket-stuff.
>>>>
>>>>-igor
>>>>
>>>>On Thu, Nov 5, 2009 at 5:52 PM,  <b...@actrix.gen.nz> wrote:
>>>>> Igor,
>>>>>
>>>>> Thanks very much for your suggestion which I followed.
>>>>>
>>>>> I have overridden it and that is an improvement but still not good.
>>>>>
>>>>> ListDataProvider dataProvider = new ListDataProvider(myList){
>>>>>   �...@override
>>>>>    public IModel<MyEntity> model(Object object)
>>>>>    {
>>>>>        return new DetachableMyEntityModel((MyEntity) object);
>>>>>    }
>>>>> };
>>>>>
>>>>> SerializableChecker does a nice job spotting:
>>>>>
>>>>> ...
>>>>> private final java.util.List
>>>>> org.apache.wicket.markup.repeater.data.ListDataProvider.list[write:1]
>>>>> [class=[Ljava.lang.Object;]
>>>>>
>>>>> private final java.util.List
>>>>> org.apache.wicket.markup.repeater.data.ListDataProvider.list[write:1][0]
>>>>> [class=MyEntity] <----- field that is not serializable
>>>>>
>>>>> I guess that private final List<T> list; of ListDataProvider wants to
>>>>> be serialized into the session which we don't want?
>>>>>
>>>>> I am trying to apply best practice - may be I should not be using
>>>>> ListDataProvider?
>>>>>
>>>>> http://old.nabble.com/How-to-avoid-Lazy-loading-exception-td17040941.html
>>>>>
>>>>> "instead of using listdataprovider you should use a dataprovider in
>>>>> that uses detachablemodels for each individual item -igor "
>>>>>
>>>>> Today, with 1.4, what is best to use for <List> results from
>>>>> EntityManager? Still DataProvider?
>>>>>
>>>>> Many thanks,
>>>>>
>>>>> Bernard
>>>>>
>>>>>
>>>>>
>>>>> On Thu, 5 Nov 2009 14:25:01 -0800, you wrote:
>>>>>
>>>>>>you have to override listdataprovider#model and return a detachable model.
>>>>>>
>>>>>>-igor
>>>>>>
>>>>>>On Thu, Nov 5, 2009 at 2:19 PM,  <b...@actrix.gen.nz> wrote:
>>>>>>> Hi,
>>>>>>>
>>>>>>> I am trying to prevent the leaking of business objects into the
>>>>>>> session.
>>>>>>>
>>>>>>> Michael made a good comment in
>>>>>>>
>>>>>>> http://www.mail-archive.com/users@wicket.apache.org/msg31187.html
>>>>>>>
>>>>>>> "... you could e.g. temporarily remove the "Serializable" from your
>>>>>>> model-classes and go spotting nonserializable exceptions until they
>>>>>>> don't ocurr anymore."
>>>>>>>
>>>>>>> which is what I did.
>>>>>>>
>>>>>>> It works nicely until I hit a problem with ListDataProvider in
>>>>>>> DataView, where I get an exception even if I use LDMs:
>>>>>>>
>>>>>>> java.lang.ClassCastException: MyEntyty cannot be cast to
>>>>>>> java.io.Serializable at
>>>>>>> org.apache.wicket.markup.repeater.data.ListDataProvider.model(ListDataProvider.java:35)
>>>>>>>
>>>>>>> It appears to me that the approach has a conflict with framework
>>>>>>> classes.
>>>>>>>
>>>>>>> What is the best way to spot session memory issues without hitting
>>>>>>> this problem?
>>>>>>>
>>>>>>> Many thanks,
>>>>>>>
>>>>>>> Bernard
>>>>>>>
>>>>>>> ---------------------------------------------------------------------
>>>>>>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
>>>>>>> For additional commands, e-mail: users-h...@wicket.apache.org
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>---------------------------------------------------------------------
>>>>>>To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
>>>>>>For additional commands, e-mail: users-h...@wicket.apache.org
>>>>>
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
>>>>> For additional commands, e-mail: users-h...@wicket.apache.org
>>>>>
>>>>>
>>>>
>>>>---------------------------------------------------------------------
>>>>To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
>>>>For additional commands, e-mail: users-h...@wicket.apache.org
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
>>> For additional commands, e-mail: users-h...@wicket.apache.org
>>>
>>>
>>
>>---------------------------------------------------------------------
>>To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
>>For additional commands, e-mail: users-h...@wicket.apache.org
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
> For additional commands, e-mail: users-h...@wicket.apache.org
>
>

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

Reply via email to