说明
主子表是指在插入数据的时候一次性插入的不是一个单表,而是一个主表带着一堆子表一起插入数据的行为,主表和子表通过某个字段进行关联,将主表上的某个字段值赋给子表的整个插入过程。主子表的结构应该是一个向下递归的树形结构,常见于一些可折叠展开的列表页面,其每一条主数据都挂着N个子数据的场景,下面先看看如何配置主子表字段间的依赖
JSRuleTable(name="zs_test_son2")
public class ZsTestSon2 {
......
@JSRuleField(dependent= "ZsTestPO.name")
public String name;
}
从上面的伪码中可以看到注解上的dependent属性,它注明了所依赖的是ZsTestPO的name这个字段,当配置好这个依赖关系后,使用主子表时主表的name字段的值就会自动赋给子表的name属性,如果没有设置任何依赖关系,则默认主外键关联,届时主表的主键值会覆盖子表的外键值
发送json请求
{
"rule": {
"name": "dependents",
"actions": [
{
"name": "add_dependent",
"dependent": {
"class": "ZsTestPO",
"rules": {
"ZsTestPO": {
"name": "add_test",
"add": {
"uuid": ["id","remark"],
"defaults": {"test_field": "nnnnnn"},
"required": ["test_field","create_date"],
"ternary": ["test_field==oiu?tiu:ppp"],
"calculate": ["salary=-<salary>+0.5*(-10*10)","bonus=<bonus>-100"]
}
},
"test.business.po.ZsTestUpdate": {
"name": "add_son1",
"add": {
"uuid": ["id"],
"defaults": {"qian": 4}
}
},
"ZSTestSonSon": {
"name": "add_son1_son1",
"add": {
"uuid": ["id"]
}
},
"test.business.po.ZsTestSon2": {
"name": "add_son2",
"add": {
"uuid": ["id"]
}
}
},
"binds": [
{
"major": {"name": "ccc","salary": 22.5,"bonus": "110","birthDay": "2021/10/08","create_date": "1922-10-08"},
"minors": {
"test.business.po.ZsTestUpdate": [
{
"major": {"ohNo": "son1_1"},
"minors": {
"ZSTestSonSon": [
{"major": {"oh_oh_no": "son1_son1_11"}},
{"major": {"oh_oh_no": "son1_son1_12"}}
]
}
},
{
"major": {"ohNo": "son1_2"},
"minors": {
"ZSTestSonSon": [
{"major": {"oh_oh_no": "son1_son1_21"}},
{"major": {"oh_oh_no": "son1_son1_22"}}
]
}
}
],
"test.business.po.ZsTestSon2": [
{"major": {"ohYes": "son2_1"}},
{"major": {"ohYes": "son2_2"}}
]
}
},
{
"major": {"name": "mmm","salary": "11.50","bonus": 120,"birthDay": "2021-02-03","create_date": "1922-02-03"},
"minors": {
"test.business.po.ZsTestUpdate": [
{"major": {"ohNo": "son1_1_1"}},
{"major": {"ohNo": "son1_1_2"}}
],
"test.business.po.ZsTestSon2": [
{"major": {"ohYes": "son2_2_1"}},
{"major": {"ohYes": "son2_2_2"}}
]
}
}
]
}
}
]
}
}
这个json的请求非常的复杂,总共涉及到了4张表,接下来我们看一下这些属性都代表什么含义
- className:主表对应的class名称,别名class,一个主子表只能有一个主表,主表下可以有多个子表
- actionRules:插入规则集合,别名rules,key为要插入的类名,value为动作模型action,其模型只能为add,可以在add模型中定义具体的插入规则如主键生成方式为uuid等
- binds:该对象属性用于绑定主子表的数据,也就是主表和哪几个子表的哪几条数据绑定在一起形成主子数据结构的。其major属性代表当前数据层级中的1条数据,其minors属性表示major数据的从数据集合,其中key要与actionRules属性中的key对应(否则会报未定义的错误),表示这些子数据是属于哪个类下面的,value为子数据,它是一个递归binds对象
返回结果
{
"msg": "操作成功",
"result": {
"add_dependent": {
"add_test": 2,
"add_son1": 4,
"add_son1_son1": 4,
"add_son2": 4
}
},
"log": null
"code": 200
}
提示:每次请求都可能会存在多个action,这些action同在一个事务下,因此当前action中请求插入主子表的动作也是在一个事务之中