快照模型
背景
业务上有很多保存快照数据的需求,比如订单中的商品,会保存当时下单时的商品详情,价格,属性等等。最初的做法是业务方通过一个 Json 字段来保存,或者设计一些冗余字段来存储对应字段。
上述方法肯定可以一定程度上满足业务需求,但是需要额外的开发。而且会造成一些额外的数据存储成本,因此 Trantor 统一提供了一种模型快照机制。
概念
在模型层面声明快照模型,每当原模型发生变更(Create/Update/Delete)时,自动产生快照记录。同时可以在业务模型上可以声明快照链接,当尝试保存时,会获取最新的快照记录保存。这样就可以关联当时的快照记录,并且可以根据快照进行搜索。
定义
✅ 要产生快照的业务模型的 @Model 注解上,声明 snapshot = @Snapshot()
@Snapshot
package io.terminus.trantorframework.api.annotation;
public @interface Snapshot {
enum GenerateStrategy { OnChange }
/** * 是否开启快照 */ boolean enabled() default true;
/** * 快照的生成策略 */ GenerateStrategy generateStrategy() default GenerateStrategy.OnChange;}代码示例
ItemBO.java
@Model(name = "商品",snapshot = @Snapshot())public class ItemBO extends BaseModel<Long> { // 业务字段...
//❗️注意:trantor在编译后的class中会生成一个”lastSnapshot“字段变量,因此请勿定义同名变量}ItemBO.class
编译后target下的ItemBO.class
@Model(name = "商品",snapshot = @Snapshot())public class ItemBO extends BaseModel<Long> { // 业务字段...
@Field @LinkMeta // ❗️多了一个类型为 ItemBOSnapshot的字段变量:lastSnapshot,即最新快照数据 private ItemBOSnapshot lastSnapshot;}ItemBOSnapshot.java
自动生成的快照模型,类名 = 快照模型类名 + "Snapshot"
/** * 商品 Snapshot Model * * Generated for {@link io.terminus.trantor.demo.item.model.OrderBO} by Trantor. * Don't modify it. */@Generated("io.terminus.trantorframework")@SnapshotModel(sourceModelClass = ItemBO.class) // sourceModelClass 为当前快照模型的来源模型classpublic class ItemBOSnapshot extends BaseSnapshot<ItemBO> { // 原模型的所有字段...}插件快速构建

使用示例
/** * 订单行 * */@Model(name = "订单行")public class OrderLineBO extends BaseModel<Long> { // field...
@Field private ItemBOSnapshot item;}@FunctionImpl(name = "保存订单行")public interface SaveOrderLineFunc {
public void execute(OrderLineBO orderLine,ItemBO item) { // item.getLastSnapshot() 获取 ItemBO 的最新快照数据 orderLine.setItem(item.getLastSnapshot()); DS.save(orderLine); }}