gpt4 book ai didi

spring - 为什么 repository.delete(entity_with_id_null) 启动 SQL INSERT + DELETE

转载 作者:行者123 更新时间:2023-12-05 01:20:46 24 4
gpt4 key购买 nike

为什么 repository.delete(entity_With_Null_Id) 启动 SQL INSERT + DELETE

使用存储库并尝试删除 id==null 的实体会启动 2 个不必要的 SQL 命令,无一异常(exception)!

    @Test
public void removeWithIdNull() {

// ARRANGE
Info infoWithIdNull = new Info("entity with id null");
List<Info> listA = infoRepository.findAll();
assertThat(listA, hasSize(0));

// ACT
infoRepository.delete(infoWithIdNull);

// ASSERT
List<Info> listResult = infoRepository.findAll();
assertThat(listResult, hasSize(0));

}

这会生成以下 SQL:一个 INSERT,然后一个 DELETE =>

    DEBUG org.hibernate.SQL - insert into info (message, version, id) values (?, ?, ?)
TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [1] as [VARCHAR] - [entity with id null]
TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [2] as [INTEGER] - [0]
TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [3] as [BIGINT] - [10]

DEBUG org.hibernate.SQL - delete from info where id=? and version=?
TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [1] as [BIGINT] - [10]
TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [2] as [INTEGER] - [0]

这真的让我很恼火,为什么 Spring-Data-JPA 在删除之前不检查实体是否存在,而不是执行 merge() ..

Data-JPA SimpleJpaRepository 中解释此行为的代码:

    @Transactional
public void delete(T entity) {

Assert.notNull(entity, "The entity must not be null!");
em.remove(em.contains(entity) ? entity : em.merge(entity));
}

这段代码对我来说似乎过于简单了。你怎么看?

最佳答案

让我们分析代码

    em.remove(em.contains(entity) ? entity : em.merge(entity));

你问 em 是否包含实体然后 remove 它,否则 merge 它然后 remove 它,merge 操作产生insert 语句

关于spring - 为什么 repository.delete(entity_with_id_null) 启动 SQL INSERT + DELETE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44277252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com