|
本帖最后由 liangyongfei 于 2013-8-23 14:28 编辑
多级主从表可以设置级联删除,在建表时主表子关联的字段后边有个“高级”,设置级联删除,如图:
当一个从表的上级主表为普通级联关系时,删除上级主表时系统会自动删除这个表对应的数据。
当一个从表的上级主表为树形级联关系时,删除上级的主表时不会把这个从表在数据库的数据删除并且会发生异常,如果您的需求要求设置一个从表的上级主表为树形,只能自己在java中写代码删除子表,同时要去掉系统的级联删除设置,如图:
java代码要写在第一级的主表的saveAction的执行前事件中
例如主表为树形:级联删从表:- public static void mainActivityBeforeSaveMY_YJBAction() {
- //找到需要删除的数据
- Table table = (Table) ContextHelper.getActionContext().getParameter("table");
- //获得所有被删除的行
- Iterator<Row> rows = table.iterator(com.justep.system.data.ModifyState.DELETE);
- Row row;
- //判断是否删除数据?
- if (rows.hasNext()) {
- //从表删除数据的ksql语句
- String deleteKsql = "DELETE FROM MY_CB p WHERE p.fF in(";
- //因为树形删除只会返回选中节点的ID,它的子是根据父的ID删除的,所以要想删除子的从表,必须先查到子的ID,然后再删除从表,
-
- //定义在ksql 条件in中的字段字符串
- StringBuffer ksqlIn = new StringBuffer();
- //定义删除的ID
- String strID = "";
- while (rows.hasNext()) {
- row = rows.next();
- //根据从表的父ID进行过滤
-
- strID = "'"+row.getValue("MY_S").toString()+"',";
- //加入StringBuffer
- ksqlIn.append(strID);
- //查得子ID并加入过滤条件中
- ksqlIn.append(getIDs(strID.substring(0, strID.length() - 1)));
- }
- //去掉最后的逗号,转化为字符串
- deleteKsql += ksqlIn.substring(0, ksqlIn.length() - 1) + ")";
- //执行KSQl
- KSQL.executeUpdate(deleteKsql, null, "/myDemo/shuZC/data", null);
- }
- }
- //递归查得子ID并返回
- private static StringBuffer getIDs(String fID){
- //定义返回值
- StringBuffer ids = new StringBuffer();
- //查到的子ID
- String id = "";
- try {
- String ksql = "SELECT e FROM MY_S e where e.fF=" + fID+"";
- com.justep.system.data.Table table = KSQL.select(ksql, null, "/myDemo/shuZC/data", null);
- Iterator<Row> rows = table.iterator();
- Row row;
- while(rows.hasNext()){
-
- row = rows.next();
- id = "'"+row.getValue("e").toString()+"',";
-
- ids.append(id);
- ids.append(getIDs(id.substring(0, id.length()-1)));
- }
- return ids;
- }catch(Exception e){
- throw new RuntimeException (e.getMessage());
- }
- }
- }
复制代码 |
|