ibatis-user-java mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Geoff Chiang <geoffchi...@yahoo.com>
Subject Re: Lazy loader throwing NPE
Date Thu, 20 Oct 2005 02:24:06 GMT
Sorry Reuben, but I'm not quite clear on how you're loading your
SqlMaps classes within Spring.  The reason that I'm wondering about
your Spring configuration is because I came across the same issue a
while back and fixed it by explicitly setting the dataSource property
of Spring's SqlMapClientFactoryBean in the Spring configuration.

Geoff


--- reuben <reubenf@sonic.net> wrote:

> Sure. I can't do this via the BeanFactory (this is a standalone jar)
> so 
> I've been doing it in code as either one of the following to wrap the
> 
> DAO in transactions:
> 
> Configuration 1:
> 
> *Code:*
> 
>             Properties p = new Properties();
>             p.setProperty("create*", "ISOLATION_REPEATABLE_READ");
>             p.setProperty("update*", "ISOLATION_REPEATABLE_READ");
>             p.setProperty("remove*", "ISOLATION_REPEATABLE_READ");
>             p.setProperty("*", "PROPAGATION_REQUIRED,readOnly");
> 
>             TransactionProxyFactoryBean tpfb = new 
> TransactionProxyFactoryBean();
>             tpfb.setTransactionManager(new 
> DataSourceTransactionManager(ds));
>             tpfb.setTransactionAttributes(p);
>             tpfb.setTarget(new DeploymentDaoIbatis(ds));
>             tpfb.afterPropertiesSet();
>             return (DeploymentDao) tpfb.getObject();
> 
> 
> 
> Configuration 2:
> 
> *Code:*
> 
>             Properties p = new Properties();
>             p.setProperty("create*", "ISOLATION_REPEATABLE_READ");
>             p.setProperty("update*", "ISOLATION_REPEATABLE_READ");
>             p.setProperty("remove*", "ISOLATION_REPEATABLE_READ");
>             p.setProperty("*", "PROPAGATION_REQUIRED,readOnly");
> 
>             ProxyFactory pf = new ProxyFactory();
>             pf.addInterface(DeploymentDao.class);
>             pf.setTarget(new DeploymentDaoIbatis(ds));
> 
>             TransactionInterceptor ti = new TransactionInterceptor();
>             ti.setTransactionAttributes(p);
>             ti.setTransactionManager(new
> DataSourceTransactionManager(ds));
>             pf.addAdvisor(new TransactionAttributeSourceAdvisor(ti));
>             return (DeploymentDao) pf.getProxy();
> 
> 
> 
> However, why do you think this has anything to do with the Spring 
> transactions? From the Ibatis source code, it seems that calling:
> 
> SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(new
> InputStreamReader(
> 
> leads to a txManager never being initted on SQLMapExecutorDelegate.
> Is 
> there another call that I'm supposed to be making?
> 
> Thanks
> Reuben
> 
> 
> Geoff Chiang wrote:
> 
> >Can you post your Spring configuration for the relevant beans?
> >
> >Geoff
> >
> >--- reubenf@sonic.net wrote:
> >
> >  
> >
> >>If I turn lazy loading on, it is throwing an NPE from one specific
> >>sqlmaps
> >>query. The other queries & inserts work correctly.
> >>
> >>When I posted this problem last week, I misdirected attention by
> >>theorizing that this had something to do with the fact that I'm
> using
> >>spring transactions; I'm pretty sure it doesn't:
> >>
> >>The stacktrace is:
> >>
> >>
> >>    
> >>
>
>com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.endTransaction(SqlMapExecutorDelegate.java:776)
> >  
> >
> >>at
> >>
> >>    
> >>
>
>com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.endTransaction(SqlMapSessionImpl.java:137)
> >  
> >
> >>at
> >>
> >>    
> >>
>
>com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.endTransaction(SqlMapClientImpl.java:115)
> >  
> >
> >>at
> >>
> >>    
> >>
>
>com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.autoEndTransaction(SqlMapExecutorDelegate.java:860)
> >  
> >
> >>at
> >>
> >>    
> >>
>
>com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:617)
> >  
> >
> >>at
> >>
> >>    
> >>
>
>com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:584)
> >  
> >
> >>at
> >>
> >>    
> >>
>
>com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:101)
> >  
> >
> >>at
> >>
> >>    
> >>
>
>com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForList(SqlMapClientImpl.java:7Cool
> >  
> >
> >>at
> >>
> >>    
> >>
>
>com.ibatis.sqlmap.engine.mapping.result.loader.ResultLoader.getResult(ResultLoader.java:72)
> >  
> >
> >>at
> >>
> >>    
> >>
>
>com.ibatis.sqlmap.engine.mapping.result.loader.LazyResultLoader.loadObject(LazyResultLoader.java:9Cool
> >  
> >
> >>at
> >>
> >>    
> >>
>
>com.ibatis.sqlmap.engine.mapping.result.loader.LazyResultLoader.invoke(LazyResultLoader.java:81)
> >  
> >
> >>at $Proxy1.toArray(Unknown Source)
> >>
> >>At this point in the code, it is doing:
> >>
> >>txManager.end(session);
> >>
> >>txManager is, obviously, a TransactionManager; it is only built,
> >>apparently, from the constructor of SqlMapConfigParser.
> >>
> >>
> >>To initialize, I do, in the constructor of my class which extends
> >>SqlMapClientDaoSupport:
> >>
> >>        super.setDataSource(ds);
> >>        SqlMapClient smc =
> SqlMapClientBuilder.buildSqlMapClient(new
> >>InputStreamReader(         
> >>
> >>    
> >>
>
>Config.getClasspathResource("classpath:.../ibatisSQLMapsConfig.xml").getInputStream()));
> >  
> >
> >>        super.setSqlMapClient(smc);
> >>
> >>
> >>SqlMapClientBuilder.buildSqlMapClient(...)
> >>
> >>calls:
> >>
> >>  return new SqlMapConfigParser().parse(reader);
> >>
> >>The constructor with no arguments is as follows:
> >>
> >>  public SqlMapConfigParser() {
> >>    this(null, null);
> >>  }
> >>
> >>However, line 272 of SqlMapConfigParser is never reached:
> >>
> 
=== message truncated ===



		
____________________________________________________ 
Do you Yahoo!? 
The best of Hasselhoff on the web - Hoffice Attachments! 
http://au.news.yahoo.com/attachments/hoffice_attachments.html

Mime
View raw message