package jef.database.dynamic; import java.sql.SQLException; import java.util.Arrays; import java.util.List; import jef.codegen.EntityEnhancer; import jef.database.DbClient; import jef.database.QB; import jef.database.VarObject; import jef.database.dialect.ColumnType; import jef.database.meta.MetaHolder; import jef.database.meta.TupleMetadata; import jef.database.test.DataSource; import jef.database.test.DataSourceContext; import jef.database.test.DatabaseDestroy; import jef.database.test.DatabaseInit; import jef.database.test.JefJUnit4DatabaseTestRunner; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; /** * 静态表与动态表的关联操作测试 * @author jiyi * */ @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="derby",url="jdbc:derby:./db;create=true"), @DataSource(name = "hsqldb", url = "jdbc:hsqldb:mem:testhsqldb", user = "sa", password = ""), @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 DynamicAndStaticTableTest extends org.junit.Assert { private DbClient db; private TupleMetadata GroupTable; /** * 添加了@DatabaseInit注解的方法将在每次连接到数据库后执行。 * @throws SQLException */ @DatabaseInit public void prepareTable() throws SQLException { db.dropTable(ServiceItem.class); db.dropTable(GroupTable); db.createTable(ServiceItem.class); db.createTable(GroupTable); } /** * 添加了@DatabaseDestroy註解的方法在每次数据库关闭时执行 */ @DatabaseDestroy public void destoryTable(){ } public DynamicAndStaticTableTest(){ GroupTable = new TupleMetadata("URM_GROUP"); GroupTable.addColumn("id", new ColumnType.AutoIncrement(8)); GroupTable.addColumn("serviceId", new ColumnType.Int(8)); GroupTable.addColumn("name", new ColumnType.Varchar(100)); GroupTable.addCascadeOneToMany("services", MetaHolder.getMeta(ServiceItem.class), QB.on(GroupTable.f("id"),ServiceItem.Field.groupId)); } /** * 测试动态表和静态表之间存在1对多级联关系时的操作 */ @Test public void testStaticCascade1vN() throws SQLException{ int id; { /** * 级联插入 */ VarObject group=GroupTable.newInstance(); group.set("name", "My Group 1"); ServiceItem s1=new ServiceItem(); s1.setName("service1"); ServiceItem s2=new ServiceItem(); s2.setName("service2"); group.set("services", Arrays.asList(s1,s2)); db.insertCascade(group); id=(Integer)group.get("id"); System.out.println("新插入的group对象id为:"+id); } { /** * 级联查询 */ VarObject group=db.load(GroupTable.newInstance().set("id", id)); assertEquals(id, group.get("id")); @SuppressWarnings("unchecked") List<VarObject> list=(List<VarObject>) group.get("services"); assertEquals(2, list.size()); //子表的记录也一同查出 System.out.println(list); } { /** * 级联更新 */ VarObject group=db.load(GroupTable.newInstance().set("id", id)); assertEquals(id, group.get("id")); group.set("name", "更新字段"); group.set("serviceId", 123); @SuppressWarnings("unchecked") List<ServiceItem> list=(List<ServiceItem>) group.get("services"); list.get(0).setPname(list.get(0).getName()); list.get(0).setName(null); list.get(0).setFlag(false); //修改一个子表的记录 list.remove(1); //删除一个子表的记录 ServiceItem s=new ServiceItem(); s.setName("service3"); list.add(s);//新增一个子表的记录 /* * 这个操作会对应4个SQL操作,分别用来更新父表、更新子表、删除子表记录、插入子表记录 ,语句举例如下: */ db.updateCascade(group); // //检查数据 group=db.load(GroupTable.newInstance().set("id", id)); assertEquals("更新字段",group.get("name")); assertEquals(123,group.get("serviceId")); int count=0; for(ServiceItem child: (List<ServiceItem>)group.get("services")){ count++; if(child.getName()==null){ assertNotNull(child.getPname()); } if("service2".equals(child.getName())){ throw new IllegalStateException();//这条记录应该已经被删除了,不可能查出来的。 } } assertEquals(2,count); } { /** * 级联删除,这个操作将删除子表中相关的2条记录。然后再删除父表中的记录 */ db.deleteCascade(GroupTable.newInstance().set("id", id)); //检查数据 VarObject group=db.load(GroupTable.newInstance().set("id", id)); assertNull(group); int count=db.count(QB.create(ServiceItem.class)); assertEquals(0,count); } } //从静态表一端添加动态表的引用问题 }