But as the proxy is a subclass of Employee, this.getBoss() will get intercepted by the proxy method handler which will load the boss immediately before hasMoney() is invoked on it. So I see no need to load it at the point of askARase() invocation.
Regards -- Carlos On Wed, Dec 16, 2009 at 4:45 PM, Poitras Christian <christian.poit...@ircm.qc.ca> wrote: > 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 > > --------------------------------------------------------------------- To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org For additional commands, e-mail: user-java-h...@ibatis.apache.org