You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-java@ibatis.apache.org by Gary Barlow <ga...@hotmail.com> on 2005/10/31 15:30:15 UTC

Cache issue using discriminator

I'm using a serialized cache with result maps that contain a discriminator. 
This fails with NotSerializableException unless I set 
lazyLoadingEnabled="false". Is this expected?

What effect does setting lazyLoadingEnabled=false have?

Error msg is:
com.ibatis.common.exception.NestedRuntimeException: Error caching 
serializable object.  Cause: java.io.NotSerializableException: 
com.ibatis.sqlmap.engine.mapping.result.loader.LazyResultLoader
Caused by: java.io.NotSerializableException: 
com.ibatis.sqlmap.engine.mapping.result.loader.LazyResultLoader

SQLMap:
<sqlMap namespace="Dimension">

   <cacheModel id="dimensionGroupCache" type="LRU" readOnly="false" 
serialize="true">
       <flushInterval hours="10"/>
       <property name="size" value="1000"/>
       <flushOnExecute statement="deleteGroup"/>
       <flushOnExecute statement="updateDimensionGroup"/>
   </cacheModel>

   <resultMap id="dimensionGroupAbstractResult" 
class="com.manu.tro.service.dimension.model.DimensionGroupAbstract">
       <result property="id" column="DIM_GROUP_ID"/>
       <result property="name" column="NAME"/>
       <result property="dimensionId" column="DIMENSION_ID"/>
       <discriminator column="TYPE" javaType="string">
           <subMap value="Group" resultMap="dimensionGroupResult"/>
           <subMap value="Range" resultMap="dimensionGroupRangeResult"/>
       </discriminator>
   </resultMap>

   <resultMap id="dimensionGroupResult" 
class="com.manu.tro.service.dimension.model.DimensionGroup" 
extends="dimensionGroupAbstractResult">
       <result property="dimensionGroupValues" column="DIM_GROUP_ID" 
select="getDimensionGroupValues"/>
   </resultMap>

   <resultMap id="dimensionGroupRangeResult" 
class="com.manu.tro.service.dimension.model.DimensionGroupRange" 
extends="dimensionGroupAbstractResult">
       <result property="from" column="FROM_VALUE"/>
       <result property="to" column="TO_VALUE"/>
   </resultMap>

   <select id="getDimensionGroup" resultMap="dimensionGroupAbstractResult" 
cacheModel="dimensionGroupCache">
   sql..................



Re: Cache issue using discriminator

Posted by Clinton Begin <cl...@gmail.com>.
Unfortunately you can't mix lazy loading with serializable caches....

This is not an iBATIS problem, but more of a CGLIB and/or Java problem. I'm
sure we could find some crazy means of managing this, but I'd rather not.
The real solution is to tell Sun that we want dynamic proxies for classes,
just like we have for interfaces....and we want them to be serializable.

Cheers,
Clinton


On 10/31/05, Gary Barlow <ga...@hotmail.com> wrote:
>
> I'm using a serialized cache with result maps that contain a
> discriminator.
> This fails with NotSerializableException unless I set
> lazyLoadingEnabled="false". Is this expected?
>
> What effect does setting lazyLoadingEnabled=false have?
>
> Error msg is:
> com.ibatis.common.exception.NestedRuntimeException: Error caching
> serializable object. Cause: java.io.NotSerializableException:
> com.ibatis.sqlmap.engine.mapping.result.loader.LazyResultLoader
> Caused by: java.io.NotSerializableException:
> com.ibatis.sqlmap.engine.mapping.result.loader.LazyResultLoader
>
> SQLMap:
> <sqlMap namespace="Dimension">
>
> <cacheModel id="dimensionGroupCache" type="LRU" readOnly="false"
> serialize="true">
> <flushInterval hours="10"/>
> <property name="size" value="1000"/>
> <flushOnExecute statement="deleteGroup"/>
> <flushOnExecute statement="updateDimensionGroup"/>
> </cacheModel>
>
> <resultMap id="dimensionGroupAbstractResult"
> class="com.manu.tro.service.dimension.model.DimensionGroupAbstract">
> <result property="id" column="DIM_GROUP_ID"/>
> <result property="name" column="NAME"/>
> <result property="dimensionId" column="DIMENSION_ID"/>
> <discriminator column="TYPE" javaType="string">
> <subMap value="Group" resultMap="dimensionGroupResult"/>
> <subMap value="Range" resultMap="dimensionGroupRangeResult"/>
> </discriminator>
> </resultMap>
>
> <resultMap id="dimensionGroupResult"
> class="com.manu.tro.service.dimension.model.DimensionGroup"
> extends="dimensionGroupAbstractResult">
> <result property="dimensionGroupValues" column="DIM_GROUP_ID"
> select="getDimensionGroupValues"/>
> </resultMap>
>
> <resultMap id="dimensionGroupRangeResult"
> class="com.manu.tro.service.dimension.model.DimensionGroupRange"
> extends="dimensionGroupAbstractResult">
> <result property="from" column="FROM_VALUE"/>
> <result property="to" column="TO_VALUE"/>
> </resultMap>
>
> <select id="getDimensionGroup" resultMap="dimensionGroupAbstractResult"
> cacheModel="dimensionGroupCache">
> sql..................
>
>
>