头图

前文《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. 新建

@Test
public 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. 更新

@Test
public void update() {
    Customer customer = Customer.find.query()
            .where().idEq(1L)
            .asDraft()
            .findOne();

    customer.setName(UUID.randomUUID().toString());
    customer.update();
}

更新的源数据必须是草稿,不能在正式版数据上直接修改,否则会报错

草稿内容可以多次修改,但不影响已发布的正式版本

4. 发布

@Test
public void publish(){

    Database database = DB.getDefault();
    Customer customer = database.publish(Customer.class, 1L);

    System.err.println(customer);
}
发布后草稿数据同步写入正式版数据结构中

5. 恢复

@Test
public void restore(){
    Database database = DB.getDefault();
    Customer customer = database.draftRestore(Customer.class, 1L);

    System.err.println(customer);
}
当草稿修改多次后又不想更新了,就可以使用恢复命令,还原到最近一次正式版数据

三、综述

文中代码由于篇幅原因有一定省略并不是完整逻辑,如有兴趣请Fork源代码 https://gitee.com/hypier/barr...

四、请关注我的公众号

请关注我的公众号


barry的异想世界
20 声望3 粉丝

引用和评论

0 条评论