跳转到内容

快照模型

背景

业务上有很多保存快照数据的需求,比如订单中的商品,会保存当时下单时的商品详情,价格,属性等等。最初的做法是业务方通过一个 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 为当前快照模型的来源模型class
public class ItemBOSnapshot extends BaseSnapshot<ItemBO> {
// 原模型的所有字段...
}

插件快速构建

snapshotModel

使用示例

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