package jef.orm.joindesc; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import jef.database.DbClient; import jef.database.ORMConfig; import jef.database.Session; import jef.database.test.DataSource; import jef.database.test.DataSourceContext; import jef.database.test.DatabaseInit; import jef.database.test.IgnoreOn; import jef.database.test.JefJUnit4DatabaseTestRunner; import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.MethodSorters; @RunWith(JefJUnit4DatabaseTestRunner.class) @DataSourceContext({ @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 = "hsqldb", url = "jdbc:hsqldb:mem:testhsqldb", user = "sa", 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}") }) @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class JoinDescrptionTest { @DatabaseInit public void init() throws SQLException { ORMConfig.getInstance().setSelectTimeout(20); ORMConfig.getInstance().setUpdateTimeout(20); ORMConfig.getInstance().setDeleteTimeout(20); db.dropTable(Student.class); db.createTable(Student.class); db.refreshTable(Lesson.class); db.refreshTable(UserToLession.class); } private DbClient db; public void testPrepareData() throws SQLException { db.truncate(UserToLession.class); { Student user=new Student("张三"); db.insert(user); } { Student user=new Student("李思"); db.insert(user); } { Student user=new Student("王五"); db.insert(user); } List<Lesson> lessions= new ArrayList<Lesson>(); lessions.add(new Lesson("语文",10)); lessions.add(new Lesson("数学",10)); lessions.add(new Lesson("英语",9)); lessions.add(new Lesson("物理",8)); lessions.add(new Lesson("化学",8)); lessions.add(new Lesson("生物",6)); lessions.add(new Lesson("体育",4)); lessions.add(new Lesson("美术",3)); lessions.add(new Lesson("音乐",2)); db.batchInsert(lessions); { db.batchInsert(Arrays.asList(new UserToLession(1,1,40), new UserToLession(1,2,56), new UserToLession(1,3,90), new UserToLession(1,4,70), new UserToLession(1,5,76), new UserToLession(1,6,55), new UserToLession(1,7,99), new UserToLession(1,8,92))); } } /** * FIXME 实际测试发现,由于Druid解析器不能支持JDBC escape语法,因此Derby案例会出错。暂时容错处理。 * 待Druid修复后再行测试。 * @throws SQLException * * * * 由于在存入对象时,没有延迟加载钩子,造成读取到缓存中的对象时,延迟加载功能未生效。 * 由于Entity有状态(延迟加载钩子),缓存中如何处理? * 其实整个缓存设计都有此问题,非级联对象被加载出来后,另一个级联查询使用的场景怎么办? */ @Test @IgnoreOn("sqlite") public void testSelect() throws SQLException { Session db=this.db.startTransaction(); testPrepareData(); Student user = db.load(new Student(1)); // 延迟加载 List<UserToLession> userTests = user.getToLession(); // 打印出 UserToLession maxScore=user.getMaxScoreLession(); maxScore.getLession(); maxScore.getUser(); System.out.println(userTests.size()); System.out.println(maxScore); db.close(); //事务被关闭了,但是还是坚持从数据库连接获取 System.out.println(maxScore.getLession().getTests()); } }