Hi Bardamu,

I think it was not clear enough due to the lack of Proxy explanation.
If I have an employee and I call getBoss() on it, it has to load the boss 
property. But what if I call a method like this in employee?
public boolean askARase() {
  if (this.getBoss().hasMoney()) {
    return true;
  } else {
    return false;
  }
}

Then, I hope the boss property is loaded before hasMoney() is called on it.
The boss property itself is a proxy that can be defined as <E extends 
Employee>, but what is E? Since iBATIS does not know for sure, I has to call 
the select to get the right type for boss as soon as any method on Employee is 
called.

Christian


-----Original Message-----
From: Carlos Pita [mailto:carlosjosep...@gmail.com] 
Sent: Wednesday, December 16, 2009 12:16 PM
To: user-java@ibatis.apache.org
Subject: Re: Lazy loading differences between ibatis 2 and 3

Hi Christian,

I understand your point but I don't get its relation to my question at all. 
Continuing your example, I would ask why employee.getName() will prematurely 
load the boss. A priori, I would expect the proxy to be smarter and only 
trigger the loading of boss if getBoss() was effectively called.

Regards
--
Bardamu

On Wed, Dec 16, 2009 at 3:09 PM, Poitras Christian 
<christian.poit...@ircm.qc.ca> wrote:
> Hi,
>
> The major problem that was present in iBATIS 2 was that lazy loaded class 
> where not always of the right type.
> For exemple, if I have multiple subclasses of a class.
> Person
> Employee inherits Person
> Director inherits Employee
>
> If I have an object Employee with a method getBoss() that returns an Employee 
> (lazy loaded), I expect that sometimes it will be a director.
> In iBATIS 2, testing (employee.getBoss() instanceof Director) will always be 
> false. This problem is due to the fact that iBATIS does not know the real 
> class of the boss property and creates a Proxy of Employee.
> In iBATIS 3, testing (employee.getBoss() instanceof Director) will be true if 
> the employee's boss is a Director. To know the real type, the statement must 
> be executed.
>
> Christian
>
>
> -----Original Message-----
> From: Carlos Pita [mailto:carlosjosep...@gmail.com]
> Sent: Wednesday, December 16, 2009 11:45 AM
> To: user-java@ibatis.apache.org
> Subject: Lazy loading differences between ibatis 2 and 3
>
> Hi all,
>
> I've the following sqlmap for ibatis 2. Suppose ibatis has its 
> lazy-loading feature enabled and I obtain a user U by means of 
> findUserById. Then I call U.getEmail() and findMemberById is not 
> executed. That's fine, one wouldn't expect the associated member to be 
> loaded until there is a real need for it. Of course, if then I call
> U.getMember().getDescription() findMemberById does execute its select, in due 
> time. That said, for ibatis 3 the same example executes findMemberById as 
> soon as U.getEmail() is invoked, loading the member before time. That's not 
> surprising if one inspects the code of ResultObjectProxy (relevant parts 
> copied below). Is this intended to work the way it does or is it a bug?
>
> <sqlMap namespace="User">
>
>        <resultMap id="userMap" class="User">
>        <result property="email" column="email"/>
>        <result property="member" column="member_id" 
> select="findMemberById"/>
>        </resultMap>
>
>        <resultMap id="memberMap" class="Member">
>        <result property="description" column="description"/>
>        </resultMap>
>
>        <select id="findUserById" resultMap="userMap">
>                select * from qpoint_user where id = #id#
>        </select>
>
>        <select id="findMemberById" resultMap="memberMap">
>                select * from cpp_member where member_id = #id#
>        </select>
>
> </sqlMap>
>
>
> public class ResultObjectProxy {
>
>   public Object invoke(Object o, Method method, Object[] args) throws 
> Throwable {
>      try {
>        if (!Object.class.equals(method.getDeclaringClass()) &&
> PropertyNamer.isGetter(method.getName())) {
>            lazyLoader.loadAll(); <-- this loads all asociations for 
> every getter invoked on this proxy
>        }
>        return method.invoke(target, args);
>      } catch (Throwable t) {
>        throw ExceptionUtil.unwrapThrowable(t);
>      }
>    }
> }
>
> Regards
> --
> Bardamu
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org
> For additional commands, e-mail: user-java-h...@ibatis.apache.org
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org
> For additional commands, e-mail: user-java-h...@ibatis.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org
For additional commands, e-mail: user-java-h...@ibatis.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org
For additional commands, e-mail: user-java-h...@ibatis.apache.org

Reply via email to