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

Reply via email to