跳到主要内容

修改操作

保存派生对象

保存实际的派生实体对象即可。Jimmer根据对象类型计算鉴别器,并写入映射策略要求的所有物理阶段。

Organization organization = Immutables.createOrganization(draft -> {
draft.setId(100L);
draft.setName("Acme");
draft.setTaxCode("ACME-001");
});

sqlClient.getEntities().save(organization);

对于SINGLE_TABLE,根属性和派生属性存储在同一行中。对于JOINED,Jimmer把根表和派生表语句 协调为一个保存操作。批量保存会根据实际类型和物理阶段进行分组。

继承实体出现在图保存中时,行为完全相同。乐观锁、事务触发器、关联、逻辑删除和 赋值表达式都会在正确的阶段继续生效。

抽象类型

抽象继承类型没有自己的鉴别器值,因此不能被insert或upsert。它可以和UPDATE_ONLY一起使用, 更新所有匹配具体分支共享的属性:

sqlClient
.getEntities()
.saveCommand(clientWithOnlyIdAndName)
.setMode(SaveMode.UPDATE_ONLY)
.execute();

该操作要求关闭类型变更,并把类型匹配模式设置为AUTOPOLYMORPHIC

类型匹配模式

save、update和delete指令使用与根查询相同的TypeMatchMode

  • AUTO精确匹配可实例化类型,多态匹配抽象类型。
  • EXACT只匹配请求的类型。
  • POLYMORPHIC匹配请求的类型及其所有可实例化子类型。

修改指令默认使用AUTO

Java保存指令:

command.setTypeMatchMode(TypeMatchMode.POLYMORPHIC);

Kotlin保存DSL:

setTypeMatchMode(TypeMatchMode.POLYMORPHIC)

关联实体可以通过setAssociatedTypeMatchModeAll、实体类型或关联属性单独配置。可变update和 delete语句也提供setTypeMatchMode

改变实体类型

默认禁止把数据库中同一个ID从一个继承分支变成另一个分支。这样可以防止运行时类型错误的对象 悄悄改写鉴别器;对于连接表继承,还能防止数据在派生表之间被意外移动。

只有当这种转换是业务操作的一部分时才应该显式启用:

sqlClient
.getEntities()
.saveCommand(organization)
.setTypeChangeAllowed(true)
.execute();

可以通过setDefaultTypeChangeAllowed全局启用,也可以通过 setAssociatedTypeChangeAllowed*系列API为关联实体单独配置。

警告

typeChangeAllowed不能和多态保存匹配组合使用。指令必须先精确识别一个源分支,才能安全执行 类型转换。

连接表继承的删除语义

删除连接表派生类型时,Jimmer会删除派生数据和根数据,并保持关联、触发器和逻辑删除语义。 删除抽象类型或多态匹配类型时,每个ID都会被路由到适用的物理分支。

映射级别的joinedTableDissociateAction决定Jimmer是否显式删除派生表数据(默认的DELETE), 还是依赖数据库的ON DELETE CASCADELAX)。详见实体映射