Hello there:

first of all a thanks to the authors for a great tool.  I am new to iBatis, but 
I'm already getting great value out of it.  

I
am currently having a hard time diagnosing a problem with one of my
mappings.  Things seem to work fine when I run my unit test from within
Eclipse, but the same test fails consistently when I run it through
Maven.  Maybe some of the more experienced eyes can spot what I'm doing
wrong.

Before diving into the details of my code, following is a
sample of the data I'm trying to fetch.  Assume the following sample
data set (apologies for the ugly formatting):

mysql> select * from expense;
+----+---------------------+--------------+--------+-----------------------+-----------+
| id | created_on          | expense_date |
 amount | description           | bucket_id |
+----+---------------------+--------------+--------+-----------------------+-----------+
|  1 | 2010-02-14 14:24:05 | 2010-01-01   |  24.95 | Fruits and Vegetables 
|         1 | 
|  2 | 2010-02-14 14:24:45 | 2010-01-25   |  15.00 | Coffee and Tea        
|         1 | 
|  3 | 2010-02-14 14:25:19 | 2010-01-30   |  32.98 | Steak and fish        
|         1 | 
|  4 | 2010-02-14 14:26:50 | 2010-02-04   |  40.95 | Sushi                 
|         6 | 
|  5 |
 2010-02-14 14:27:19 | 2010-02-17   | 121.00 | Metro pass            |         
5 | 
|  6 | 2010-02-14 14:28:23 | 2010-03-07   |  39.98 | Book                  
|         7 | 
|  7 | 2010-03-01 16:45:12 | 2010-03-12   |  87.52 | Groceries             
|         1 | 
+----+---------------------+--------------+--------+-----------------------+-----------+
7 rows in set (0.00 sec)

The following query (which I want to define in my mappings) yields the results:

mysql> select expense_date, extract(YEAR_MONTH from expense_date) as period 
from expense group by
 period;
+--------------+--------+
| expense_date | period |
+--------------+--------+
| 2010-01-01   | 201001 | 
| 2010-02-04   | 201002 | 
| 2010-03-07   | 201003 | 
+--------------+--------+
3 rows in set (0.00 sec)

mysql> 

Now, on Java land, I got the following:

ExpenseMapping.xml
------------------

<mapper namespace="com.foo.persistence.ibatis.mapper.ExpenseMapper">

... some mappings

    <select id="selectExpensePeriods" resultType="java.util.Date">
        select expense_date, extract(YEAR_MONTH from expense_date) as period 
from expense group by period;
    </select>

... some more mappings

</mapper>

ExpenseMapper.java
------------------

public interface ExpenseMapper {
    
    List<Date>
 selectExpensePeriods();    
}

IbatisExpenseDao.java
---------------------

public class IbatisExpenseDao  {

    private SessionManager sessionManager;

    public IbatisExpenseDao( SessionManager sessionManager ) {
        this.sessionManager = sessionManager;
    }
    
    public List<ExpensePeriod> getPeriods() {
        List<Date> dates = mapper().selectExpensePeriods();
        return ExpensePeriod.listFrom( dates );
    }

    private ExpenseMapper mapper() {
        SqlSession session = sessionManager.getCurrentSession();
        return session.getMapper( ExpenseMapper.class );
   
 }
}


SessionManager.java
-------------------

class SessionManager {

    private final SqlSessionFactory sessionFactory;

    private ThreadLocal<SqlSessionWrapper> localSession = new 
ThreadLocal<SqlSessionWrapper>() {
       �...@override
        protected SqlSessionWrapper initialValue() {
            return newSqlSessionWrapper();
        }
    };
    
    SessionManager( SqlSessionFactory sessionFactory ) {
        this.sessionFactory = sessionFactory;
    }
    
    private SqlSessionWrapper newSqlSessionWrapper() {
        return new SqlSessionWrapper(
 sessionFactory.openSession() );
    }
    
    public SqlSession getCurrentSession() {
        SqlSessionWrapper session = localSession.get();
        if ( session.isTerminated() ) {
            session = newSqlSessionWrapper();
            localSession.remove();
            localSession.set( session );
        }
        return session;
    }
}

The
above class is meant to manage sessions on a per-thread basis; the idea
that each thread can share the same session so long as it's open.  The
moment the current session is terminated (by calling
close/commit/rollback) a new session is opened.

SqlSessionWrapper is just an adapter delegating all
method calls to its private SqlSession instance;  it marks its state as
terminated whenever close(), commit() and rollback() methods are
invoked.

Finally, the unit test that is giving me grief:

IbatisExpenseDaoTest.java
-------------------------

   �...@test
    public void testGetPeriods() {
        
        ExpensePeriod[] expectedPeriods = getExpectedPeriods();
        
        List<ExpensePeriod> retrievedPeriods = expenseDao.getPeriods();
        
        assertThat( retrievedPeriods, hasItems( expectedPeriods ) );
    }

As
I mentioned, this test passes all the time in Eclipse, but fails all
the time in Maven (I get an empty list for retrievedPeriods).  At some
point in the past, this test was working on both, Eclipse and Maven.

Does
anyone have any ideas of what I may be doing wrong? or at least can you
suggest  a way in which I may debug this problem (ie is there any
iBatis specific tracing I can turn on to see what's going on?).

Thank you very much for taken the time to read all this.

Best regards.

J.


      __________________________________________________________________
Yahoo! Canada Toolbar: Search from anywhere on the web, and bookmark your 
favourite sites. Download it now
http://ca.toolbar.yahoo.com.

Reply via email to