根对象保存模式
保存模式
保存指令支持5种保存模式,控制聚合根本身的保存方式
-
UPSERT: 这是默认的模式。先通过查询判断被保存的聚合根对象是否存在:
-
如果不存在:执行INSERT语句
-
如果存在:执行UPDATE语句
-
-
INSERT_ONLY: 无条件执行INSERT语句
-
INSERT_IF_ABSENT:
-
如果数据已经存在,忽略操作
-
否则,插入数据
-
-
UPDATE_ONLY: 无条件执行UPDATE语句
-
NON_IDEMPOTENT_UPSERT (不推荐):
-
如果对象的@Id属性或@Key属性被指定,执行与UPSERT等价的行为
-
否则,执行INSERT操作
-
警告
保存模式仅影响聚合根对象,不影响其他关联对象。
对于关联对象而言,请参考关联对象保存模式。
1. INSERT_ONLY
INSERT_ONLY
表示无条件插入数据
- Java
- Kotlin
List<Book> books = Arrays.asList(
Immutables.createBook(draft -> {
draft.setName("SQL in Action");
draft.setEdition(3);
draft.setPrice(new BigDecimal("49.9"));
draft.setStoreId(2L);
}),
Immutables.createBook(draft -> {
draft.setName("LINQ in Action");
draft.setEdition(2);
draft.setPrice(new BigDecimal("39.9"));
draft.setStoreId(2L);
})
);
List<Long> allocatedIds = sqlClient
.saveEntities(
books,
SaveMode.INSERT_ONLY
)
.getItems()
.stream()
.map(item -> item.getModifiedEntity().id())
.collect(Collectors.toList());
System.out.println("Allocated ids: " + allocatedIds);
val books = listOf(
Book {
name = "SQL in Action"
edition = 3
price = BigDecimal("49.9")
storeId = 2L
},
Book {
name = "SQL in Action"
edition = 2
price = BigDecimal("39.9")
storeId = 2L
}
)
val allocatedIds = sqlClient
.saveEntities(
books,
SaveMode.INSERT_ONLY
)
.items
.map {
it.modifiedEntity.id
}
println("Allocated ids: $allocatedIds")
INSERT_ONLY的工作方式非常简单,不做任何判断,无条件插入。
Jimmer会为不同数据库生成不同的SQL
- 大部分数据库
- Mysql
insert into BOOK(
NAME, EDITION, PRICE, STORE_ID
) values(?, ?, ?, ?)
/* batch-0: SQL in Action, 3, 49.9, 2 */
/* batch-1: [LINQ in Action, 2, 39.9, 2 */
警告
默认情况下,MySQL的批量操作不会被采用,而采用多条SQL。具体细节请参考MySQL的问题
-
insert into BOOK(
NAME, EDITION, PRICE, STORE_ID
) values(
? /* SQL in Action */,
? /* 3 */,
? /* 49.9 */,
? /* 2 */
) -
insert into BOOK(
NAME, EDITION, PRICE, STORE_ID
) values(
? /* LINQ in Action */,
? /* 2 */,
? /* 39.9 */,
? /* 2 */
)