乐趣区

关于orm:EBean-ORM-框架介绍3实体草稿功能

前文《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…

四、请关注我的公众号

退出移动版