前文《EBean ORM 框架介绍-2.字段加密、更新日志和历史记录》 介绍了不少特性注解,本文将介绍实体草稿功能
草稿功能主要用于一些需要进行流程审批或重复修改后的重要内容发布,先打草稿确认没有问题后再行发布的场景。
此实现方案较以往完全自主实现最大的区别在于草稿与正式版数据结构相互独立,程序逻辑却为一体
一、设置草稿
 @Draftable@Builder@Data@Entity@ToString(callSuper = true)@AllArgsConstructor@NoArgsConstructor@Table(name = "customer")public class Customer extends BaseModel {
    public static final CustomerFinder find = new CustomerFinder();
    private String name;
    @DraftOnly    Timestamp whenPublish;
    @DraftDirty    Boolean draft;
    @DraftReset    String author;
    @OneToMany(cascade = {CascadeType.ALL})    List<Group> groupList;}
@DraftableElement@Entity@Table(name = "c_group")public class Group extends BaseModel {    private String name;
}
       复制代码
 1. 草稿注解
在主实体上设置@Draftable注解,标记为实体拥有草稿功能;在其子实体头上@DraftableElement注解,标记随主实体同步维护草稿状态。
@DraftableElement 支持**@OneToMany 和 @ManyToMany**关系设置
2. @DraftOnly
此注解表示仅在草稿中存在,正式版数据结构中没有此字段。可用于流程审批记录,草稿修改记录等场景
3. DraftDirty
此注解可以放在一个布尔属性上,仅在草稿中存在。当草稿被保存时,其自动设置为 true;当草稿被发布时,其自动设置为 false。此注解可用于数据是否被发布
4. DraftReset
此注解属性值在草稿发布之后,草稿中的值将自动设置为 NULL,正式版本的值不变
二、草稿实现
1. 新建
 @Testpublic void create() {  List<Group> list = new ArrayList<>();  list.add(Group.builder().name("abc").build());  list.add(Group.builder().name("def").build());
  Customer customer = Customer.builder()    .name("abc")    .author("hypier")    .groupList(list)    .whenPublish(new Timestamp(System.currentTimeMillis()))    .build();
  customer.save();}
       复制代码
 
主实体和子实体同时保存时,将为两个数据表创建草稿数据库表
当设置了草稿注解,新建操作只会写到 xxx_draft 表中,正式版没有数据
2. 查询
 Customer customer = Customer.find.query()              .where().idEq(1L)              .asDraft()              .findOne();
List<Customer> customers = Customer.find.query()                .where().eq("draft", true)                .asDraft()                .findList();
       复制代码
 
asDraft():表示查询草稿数据,去掉则是正式版数据
3. 更新
 @Testpublic void update() {    Customer customer = Customer.find.query()            .where().idEq(1L)            .asDraft()            .findOne();
    customer.setName(UUID.randomUUID().toString());    customer.update();}
       复制代码
 
更新的源数据必须是草稿,不能在正式版数据上直接修改,否则会报错
草稿内容可以多次修改,但不影响已发布的正式版本
4. 发布
 @Testpublic void publish(){
    Database database = DB.getDefault();    Customer customer = database.publish(Customer.class, 1L);
    System.err.println(customer);}
       复制代码
 
发布后草稿数据同步写入正式版数据结构中
5. 恢复
 @Testpublic void restore(){    Database database = DB.getDefault();    Customer customer = database.draftRestore(Customer.class, 1L);
    System.err.println(customer);}
       复制代码
 
当草稿修改多次后又不想更新了,就可以使用恢复命令,还原到最近一次正式版数据
三、综述
文中代码由于篇幅原因有一定省略并不是完整逻辑,如有兴趣请 Fork 源代码 https://gitee.com/hypier/barry-ebean/tree/master/ebean-section-3
四、请关注我的公众号
评论