Author: cbegin
Date: Mon May 18 15:52:39 2009
New Revision: 775996

URL: http://svn.apache.org/viewvc?rev=775996&view=rev
Log:
Added result loader test for lazy loading across transaction boundaries.

Modified:
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/loader/ResultLoader.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/loader/ResultObjectProxy.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/PropertyNamer.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/type/TypeAliasRegistry.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogMapper.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogMapper.xml
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/IbatisConfig.java

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java?rev=775996&r1=775995&r2=775996&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java
 Mon May 18 15:52:39 2009
@@ -38,7 +38,7 @@
 
   public void close() {
     try {
-      transaction.close();
+      if (transaction != null) transaction.close();
     } catch (SQLException e) {
       // Ignore.  There's nothing that can be done at this point.
     } finally {
@@ -123,6 +123,9 @@
   }
 
   public void commit(boolean required) throws SQLException {
+    if (closed) {
+      throw new ExecutorException("Cannot commit, transaction is already 
closed");
+    }
     localCache.clear();
     flushStatements();
     if (required) {
@@ -131,9 +134,11 @@
   }
 
   public void rollback(boolean required) throws SQLException {
-    localCache.clear();
-    if (required) {
-      transaction.rollback();
+    if (!closed) {
+      localCache.clear();
+      if (required) {
+        transaction.rollback();
+      }
     }
   }
 

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/loader/ResultLoader.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/loader/ResultLoader.java?rev=775996&r1=775995&r2=775996&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/loader/ResultLoader.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/loader/ResultLoader.java
 Mon May 18 15:52:39 2009
@@ -7,6 +7,8 @@
 import org.apache.ibatis.mapping.ExecutorType;
 import org.apache.ibatis.transaction.TransactionFactory;
 import org.apache.ibatis.transaction.Transaction;
+import org.apache.ibatis.logging.jdbc.ConnectionLogger;
+import org.apache.ibatis.logging.*;
 
 import javax.sql.DataSource;
 import java.sql.SQLException;
@@ -15,6 +17,8 @@
 
 public class ResultLoader {
 
+  private static final Log log = LogFactory.getLog(Connection.class);
+
   protected static final Class[] LIST_INTERFACES = new Class[]{List.class};
   protected static final Class[] SET_INTERFACES = new Class[]{Set.class};
 
@@ -36,7 +40,7 @@
   }
 
   public Object loadResult() throws SQLException {
-    List list = selectListFromNewExecutor();
+    List list = selectList();
     if (targetType != null && Set.class.isAssignableFrom(targetType)) {
       resultObject = new HashSet(list);
     } else if (targetType != null && 
Collection.class.isAssignableFrom(targetType)) {
@@ -53,7 +57,7 @@
     return resultObject;
   }
 
-  private List selectListFromNewExecutor() throws SQLException {
+  private List selectList() throws SQLException {
     Executor localExecutor = executor;
     if (localExecutor.isClosed()) {
       localExecutor = newExecutor();
@@ -75,6 +79,7 @@
     DataSource ds = environment.getDataSource();
     if (ds == null) throw new ExecutorException("ResultLoader could not load 
lazily.  DataSource was not configured.");
     Connection conn = ds.getConnection();
+    conn = wrapConnection(conn);
     Transaction tx = txFactory.newTransaction(conn, false);
     return configuration.newExecutor(tx, ExecutorType.SIMPLE);
   }
@@ -83,6 +88,14 @@
     return resultObject == null;
   }
 
+  private Connection wrapConnection(Connection connection) {
+    if (log.isDebugEnabled()) {
+      return ConnectionLogger.newInstance(connection);
+    } else {
+      return connection;
+    }
+  }
+
   private Object[] listToArray(List list, Class type) {
     Object array = java.lang.reflect.Array.newInstance(type, list.size());
     array = list.toArray((Object[]) array);

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/loader/ResultObjectProxy.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/loader/ResultObjectProxy.java?rev=775996&r1=775995&r2=775996&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/loader/ResultObjectProxy.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/loader/ResultObjectProxy.java
 Mon May 18 15:52:39 2009
@@ -31,7 +31,7 @@
         Object value = method.invoke(target, args);
         if (value == null) {
           String methodName = method.getName();
-          if (PropertyNamer.isProperty(methodName)) {
+          if (PropertyNamer.isGetter(methodName)) {
             if (lazyLoader.loadByMethod(methodName)) {
               value = method.invoke(target, args);
             }

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/PropertyNamer.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/PropertyNamer.java?rev=775996&r1=775995&r2=775996&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/PropertyNamer.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/PropertyNamer.java
 Mon May 18 15:52:39 2009
@@ -24,4 +24,12 @@
     return name.startsWith("get") || name.startsWith("set") || 
name.startsWith("is");
   }
 
+  public static boolean isGetter(String name) {
+    return name.startsWith("get") || name.startsWith("is");
+  }
+
+  public static boolean isSetter(String name) {
+    return name.startsWith("set");
+  }
+
 }

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/type/TypeAliasRegistry.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/type/TypeAliasRegistry.java?rev=775996&r1=775995&r2=775996&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/type/TypeAliasRegistry.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/type/TypeAliasRegistry.java
 Mon May 18 15:52:39 2009
@@ -39,6 +39,14 @@
     return value;
   }
 
+  public void registerAlias(Class type) {
+    registerAlias(type.getSimpleName(), type.getName());
+  }
+
+  public void registerAlias(String alias, Class type) {
+    registerAlias(alias, type.getName());
+  }
+
   public void registerAlias(String alias, String value) {
     assert alias != null;
     String key = alias.toLowerCase();

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java?rev=775996&r1=775995&r2=775996&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java
 Mon May 18 15:52:39 2009
@@ -16,6 +16,24 @@
   }
 
   @Test
+  public void shouldSelectBlogWithPostsUsingSubSelect() throws Exception {
+    SqlSession session = sqlSessionFactory.openSession();
+    try {
+      BoundBlogMapper mapper = session.getMapper(BoundBlogMapper.class);
+      Blog b = mapper.selectBlogWithPostsUsingSubSelect(1);
+      assertEquals(1, b.getId());
+      session.close();
+      assertNotNull(b.getAuthor());
+      assertEquals(101, b.getAuthor().getId());
+      assertEquals("jim", b.getAuthor().getUsername());
+      assertEquals("********", b.getAuthor().getPassword());
+      assertEquals(2, b.getPosts().size());
+    } finally {
+      session.close();
+    }
+  }
+
+  @Test
   public void shouldFindPostsInList() throws Exception {
     SqlSession session = sqlSessionFactory.openSession();
     try {

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogMapper.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogMapper.java?rev=775996&r1=775995&r2=775996&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogMapper.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogMapper.java
 Mon May 18 15:52:39 2009
@@ -10,6 +10,10 @@
 
   //======================================================
 
+  Blog selectBlogWithPostsUsingSubSelect(int id);
+
+  //======================================================
+
   int selectRandom();
 
   //======================================================

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogMapper.xml
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogMapper.xml?rev=775996&r1=775995&r2=775996&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogMapper.xml
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogMapper.xml
 Mon May 18 15:52:39 2009
@@ -14,4 +14,27 @@
     SELECT * FROM blog
   </select>
 
+  <resultMap id="blogWithPosts" type="Blog">
+    <id property="id" column="id"/>
+    <result property="title" column="title"/>
+    <association property="author" column="author_id"
+                 select="selectAuthorWithInlineParams"/>
+    <collection property="posts" column="id" select="selectPostsForBlog"/>
+  </resultMap>
+
+  <select id="selectBlogWithPostsUsingSubSelect" parameterType="int" 
resultMap="blogWithPosts">
+    select * from Blog where id = #{id}
+  </select>
+
+  <select id="selectAuthorWithInlineParams"
+          parameterType="int"
+          resultType="domain.blog.Author">
+    select * from author where id = #{id}
+  </select>
+
+  <select id="selectPostsForBlog" parameterType="int" resultType="Post">
+    select * from Post where blog_id = #{blog_id}
+  </select>
+
+
 </mapper>
\ No newline at end of file

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/IbatisConfig.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/IbatisConfig.java?rev=775996&r1=775995&r2=775996&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/IbatisConfig.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/IbatisConfig.java
 Mon May 18 15:52:39 2009
@@ -9,6 +9,8 @@
 
 import javax.sql.DataSource;
 
+import domain.blog.*;
+
 public class IbatisConfig {
 
   public static SqlSessionFactory getSqlSessionFactory() {
@@ -19,6 +21,11 @@
       TransactionFactory transactionFactory = new JdbcTransactionFactory();
       Environment environment = new Environment("Production", 
transactionFactory, dataSource);
       Configuration configuration = new Configuration(environment);
+      configuration.setLazyLoadingEnabled(true);
+      configuration.setEnhancementEnabled(true);
+      configuration.getTypeAliasRegistry().registerAlias(Blog.class);
+      configuration.getTypeAliasRegistry().registerAlias(Post.class);
+      configuration.getTypeAliasRegistry().registerAlias(Author.class);
       configuration.addMapper(BoundBlogMapper.class);
       configuration.addMapper(BoundAuthorMapper.class);
       return new DefaultSqlSessionFactory(configuration);


Reply via email to