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);