package jef.orm.onetable; import java.sql.SQLException; import java.util.List; import org.apache.commons.lang.RandomStringUtils; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import jef.database.DbClient; import jef.database.ORMConfig; import jef.database.test.DataSource; import jef.database.test.DataSourceContext; import jef.database.test.DatabaseInit; import jef.database.test.JefJUnit4DatabaseTestRunner; import jef.orm.multitable2.model.EnumationTable; import jef.orm.multitable2.model.Root; import jef.tools.string.RandomData; /** * Schema重定向单元测试类 * * @Date 2012-10-17 */ @RunWith(JefJUnit4DatabaseTestRunner.class) @DataSourceContext({ @DataSource(name = "hsqldb", url = "jdbc:hsqldb:mem:testhsqldb", user = "sa", password = ""), @DataSource(name = "oracle", url = "${oracle.url}", user = "${oracle.user}", password = "${oracle.password}"), @DataSource(name = "mysql", url = "${mysql.url}", user = "${mysql.user}", password = "${mysql.password}"), @DataSource(name = "postgresql", url = "${postgresql.url}", user = "${postgresql.user}", password = "${postgresql.password}"), @DataSource(name = "derby", url = "jdbc:derby:./db;create=true"), @DataSource(name = "sqlite", url = "jdbc:sqlite:test.db?date_string_format=yyyy-MM-dd HH:mm:ss"), @DataSource(name = "sqlserver", url = "${sqlserver.url}", user = "${sqlserver.user}", password = "${sqlserver.password}") }) public class AutoAdjustSchemaTest { private static final String TABLE_NAME = "root_cus"; private DbClient db; @DatabaseInit public void init() { // ORMConfig.getInstance().setSchemaMapping("AILK2:,JIYI:pomelo"); try { dropTable(); createtable(); } catch (SQLException e) { e.printStackTrace(); Assert.fail(e.getMessage()); } } private void dropTable() throws SQLException { db.dropTable(TABLE_NAME); } private void createtable() throws SQLException { db.createTable(Root.class, TABLE_NAME, null); db.createTable(EnumationTable.class); ORMConfig.getInstance().cacheDebug = true; } @SuppressWarnings("rawtypes") @Test public void testCRUD() throws SQLException { Assert.assertTrue(db.existTable(TABLE_NAME)); Root root = RandomData.newInstance(Root.class); db.insert(root, TABLE_NAME); //当发生多表外连接级联时,CUSTOMTABLE无效。 root.getQuery().setCustomTableName(TABLE_NAME); Assert.assertEquals(1, db.select(root.getQuery(), null).size()); root.startUpdate(); String name = "name" + RandomStringUtils.randomNumeric(6); root.setName(name); db.update(root, TABLE_NAME); root.getQuery().setCustomTableName(TABLE_NAME); List roots = db.select(root.getQuery(), null); //此前查询是自动关联为多表查询的,此时缓存也是按多表进行的。然后更新了单表数据,此时多表缓存并未更新,造成多表查询缓存再次命中 //得到了更新前的数据 //BUG: 更新单表数据时,没有刷新引用到这张表的多表查询的缓存。 Assert.assertEquals(name, ((Root) roots.get(0)).getName().trim()); root.getQuery().setCustomTableName(TABLE_NAME); db.delete(root); root.getQuery().setCustomTableName(TABLE_NAME); Assert.assertEquals(0, db.select(root.getQuery(), null).size()); } }