前文《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/barry-ebean/tree/master/ebean-section-3