在多模块 Java 应用程序中的 INSERT/UPDATE 之前禁用 SELECT

Posted

技术标签:

【中文标题】在多模块 Java 应用程序中的 INSERT/UPDATE 之前禁用 SELECT【英文标题】:Disable SELECT before INSERT/UPDATE in multi-module java application 【发布时间】:2021-05-30 21:08:06 【问题描述】:

我在一个通用模块中定义了一个实体类,如下所示。

@Entity(name="TABLE_NAME")
class TableName
....

现在我有两个模块 module1module2 其中 module1 INSERTs 行数据和 module2 对数据进行更新。我们正在使用saveEntity(),它在插入/更新之前进行选择。该表是大表,也需要一些时间来进行插入/更新和占用会话。 @Entity 类作为依赖从模块 1 和模块 2 访问。我的问题是

    如何在模块 1 中插入之前禁用选择? 如何在模块 2 中在 UPDATE 之前禁用选择?

【问题讨论】:

【参考方案1】:

如果您使用的是 Spring-data-jpa,则拥有 JPA 存储库会有所帮助,例如

@Repository public interface TableNameRepository extends JpaRepository<TableName, DataTypeOfIdInTheEntityClass>

然后调用方法 TableNameRepository.save(entityObject)

【讨论】:

我的理解是 save() 将调用 SELECT 以了解它是否是新 ID。然后它将决定是否插入新密钥,否则将进行更新。我在这里看到两次往返。我正在努力避免这种情况。 我正在考虑的一个选项是在实体上实现 Persistable 并将 isNew() 覆盖为 true。但是在 module2 中 isNew() 应该被覆盖为 false。这就是我在实施方面遇到难题的地方。 稍微有点不同,只是好奇,假设模块中可以有多个并行调用 save 方法,这不是在合并更改之前选择实体的最新快照的保障措施好东西? 我的应用程序总是尝试保存最新的快照,并且模块中的该实体没有后续的保存/更新模块。当我在模块中点击 save() 时,正在保存的实体将保存到数据库中,并且不会在模块中再次使用。

以上是关于在多模块 Java 应用程序中的 INSERT/UPDATE 之前禁用 SELECT的主要内容,如果未能解决你的问题,请参考以下文章

在多模块项目中读取属性文件

在多模块 maven 项目中的模块之间共享 src/test 类

如何在多模块 Gradle 项目中构建分发包?

java 多线程-lambda在多线程中的应用

Apache POI在多线程中的tmp目录上获取java.io.IOException

在多模块 Spring Boot 项目中使用属性