/**
* Copyright 2009-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ibatis.session;
import org.apache.ibatis.BaseDataTest;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.domain.blog.Author;
import org.apache.ibatis.exceptions.PersistenceException;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.varia.NullAppender;
import org.junit.BeforeClass;
import org.junit.Test;
import javax.sql.DataSource;
import java.util.concurrent.atomic.AtomicInteger;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for specify the behavior when detects an unknown column (or unknown property type) of automatic mapping target.
*
* @since 3.4.0
* @author Kazuki Shimizu
*/
public class AutoMappingUnknownColumnBehaviorTest {
interface Mapper {
@Select({
"SELECT ",
" ID,",
" USERNAME as USERNAMEEEE,", // unknown column
" PASSWORD,",
" EMAIL,",
" BIO",
"FROM AUTHOR WHERE ID = #{id}"})
Author selectAuthor(int id);
@Select({
"SELECT ",
" ID,", // unknown property type
" USERNAME",
"FROM AUTHOR WHERE ID = #{id}"})
SimpleAuthor selectSimpleAuthor(int id);
}
static class SimpleAuthor {
private AtomicInteger id; // unknown property type
private String username;
public AtomicInteger getId() {
return id;
}
public void setId(AtomicInteger id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
public static class LastEventSavedAppender extends NullAppender {
private static LoggingEvent event;
public void doAppend(LoggingEvent event) {
LastEventSavedAppender.event = event;
}
}
private static SqlSessionFactory sqlSessionFactory;
@BeforeClass
public static void setup() throws Exception {
DataSource dataSource = BaseDataTest.createBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("Production", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(Mapper.class);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
}
@Test
public void none() {
sqlSessionFactory.getConfiguration().setAutoMappingUnknownColumnBehavior(AutoMappingUnknownColumnBehavior.NONE);
SqlSession session = sqlSessionFactory.openSession();
try {
Mapper mapper = session.getMapper(Mapper.class);
Author author = mapper.selectAuthor(101);
assertThat(author.getId()).isEqualTo(101);
assertThat(author.getUsername()).isNull();
} finally {
session.close();
}
}
@Test
public void warningCauseByUnknownPropertyType() {
sqlSessionFactory.getConfiguration().setAutoMappingUnknownColumnBehavior(AutoMappingUnknownColumnBehavior.WARNING);
SqlSession session = sqlSessionFactory.openSession();
try {
Mapper mapper = session.getMapper(Mapper.class);
SimpleAuthor author = mapper.selectSimpleAuthor(101);
assertThat(author.getId()).isNull();
assertThat(author.getUsername()).isEqualTo("jim");
assertThat(LastEventSavedAppender.event.getMessage().toString()).isEqualTo("Unknown column is detected on 'org.apache.ibatis.session.AutoMappingUnknownColumnBehaviorTest$Mapper.selectSimpleAuthor' auto-mapping. Mapping parameters are [columnName=ID,propertyName=id,propertyType=java.util.concurrent.atomic.AtomicInteger]");
} finally {
session.close();
}
}
@Test
public void failingCauseByUnknownColumn() {
sqlSessionFactory.getConfiguration().setAutoMappingUnknownColumnBehavior(AutoMappingUnknownColumnBehavior.FAILING);
SqlSession session = sqlSessionFactory.openSession();
try {
Mapper mapper = session.getMapper(Mapper.class);
mapper.selectAuthor(101);
} catch (PersistenceException e) {
assertThat(e.getCause()).isInstanceOf(SqlSessionException.class);
assertThat(e.getCause().getMessage()).isEqualTo("Unknown column is detected on 'org.apache.ibatis.session.AutoMappingUnknownColumnBehaviorTest$Mapper.selectAuthor' auto-mapping. Mapping parameters are [columnName=USERNAMEEEE,propertyName=USERNAMEEEE,propertyType=null]");
} finally {
session.close();
}
}
}