gpt4 book ai didi

java - Spring Data JPA + Hibernate 执行保存方法,但不执行插入/更新语句

转载 作者:太空宇宙 更新时间:2023-11-04 09:33:34 27 4
gpt4 key购买 nike

问题

问题是,在每次使用 Maven 构建项目时,构建都会随机生成一个可用的 jar 或损坏的 jar。显然,代码或配置都没有任何更改。

我所说的破损是什么意思?

  • 破 jar 。作业正确启动和结束,没有异常,没有任何类型的回滚,并且 CrudRepository 的所有保存方法都执行得很好。问题是,即使我在日志中看到 select 语句来获取插入序列的下一个值,插入也永远不会被记录。检查数据库,插入不仅没有被记录,而且实际上它们都从未被执行。事实上,相应的表仍然是空的!一个更重要的细节是传递给 CrudRepository 保存方法的实体已设置 ID。所有保存/更新都是如此,而不仅仅是其中一些。
  • 工作 JAR。 select 和 insert 语句都被正确记录,并且记录被插入到表中。

通常,每 5/6 次构建,都会生成 1 个工作 JAR,而 4/5 会被破坏。通过二进制比较,损坏的 jar 和工作的 jar 是相同的。

一旦JAR被编译,如果它被破坏,每次执行都会被破坏,无论执行多少次。对于工作中的人来说也是如此。

我已经尝试过的

  1. 更改 Spring/Hibernate 版本
  2. 在不同机器上编译
  3. 用 JpaRepository 替换 CrudRepository
  4. 使用 saveAndFlush 强制提交(导致生成异常)

配置

我有一个基于 Spring Data JPA 和 Hibernate 的 Spring Batch 项目。该批处理由 sh 文件执行。正如您在配置中看到的,出于调试原因,我将 hibernate.show_sql 参数设置为 true。数据库为Oracle 11g。

POM:

    <properties>
<spring-version>5.1.5.RELEASE</spring-version>
<hibernate-version>5.4.1.Final</hibernate-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-core</artifactId>
<version>4.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>2.1.5.RELEASE</version>
</dependency>

<!-- Hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate-version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate-version}</version>
</dependency>
.....
</dependencies>

hibernate 属性:

hibernate.synonyms=true
hibernate.allocationSize=1000
hibernate.order_inserts=true
hibernate.order_updates=true
hibernate.show_sql=true
hibernate.jdbc.batch_versioned_data=true
hibernate.id.new_generator_mappings=true
hibernate.jdbc.batch_size=30
hibernate.generate_statistics=false

工作日志:

2019-06-27 10:42:03.558 [pool-3-thread-19] INFO  i.a.n.b.t.XXX (246) - Elaborazione TABLE1 con SEQU: 2071042
Hibernate: select SEQUENCE1.nextval from dual
Hibernate: insert into TABLE2 (........) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: select column1, column2 ... from TABLE3 where condtion
2019-06-27 10:42:03.651 [pool-3-thread-19] INFO i.a.n.b.s.i.BaseOrderServiceImpl (185) - Recuperato record dalla TABLE3 con ID : 2071042

损坏的日志:

2019-06-27 10:42:03.558 [pool-3-thread-19] INFO  i.a.n.b.t.XXX (246) - Elaborazione TABLE1 con SEQU: 2071042
Hibernate: select SEQUENCE1.nextval from dual

INSERT MISSING HERE

Hibernate: select column1, column2 ... from TABLE3 where condtion
2019-06-27 10:42:03.651 [pool-3-thread-19] INFO i.a.n.b.s.i.BaseOrderServiceImpl (185) - Recuperato record dalla TABLE3 con ID : 2071042

寻求帮助:

每次需要部署项目时,我都会多次构建项目,持续几个月。我想一劳永逸地解决这个问题,非常感谢您的帮助。

如果您需要代码片段,请询问我,但通常它们是使用基本实体进行正常保存,使用 @Transactional 表示法与工作 JAR 配合良好。

谢谢。

更新

正如建议的那样,我尝试将 spring 和 hibernate 依赖项统一为同一版本。问题依然存在。

更新pom

 <properties>
<spring-version>5.0.12.RELEASE</spring-version>
<hibernate-version>5.2.17.Final</hibernate-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-core</artifactId>
<version>4.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>2.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.2.17.Final</version>
</dependency>
</dependencies>

最佳答案

我通过以下步骤解决了该问题:

  • @bdshadow 建议的版本修订。
  • 我有一个 @Configuration 类,带有 @EnableJpaRepositories,entityManagerFactoryReftransactionManager 引用此类中定义的 bean。这些bean 具有默认限定符entityManagerFactorytransactionManager。我更改了限定符并向其添加了 @Primary 符号。

这些步骤解决了问题。

关于java - Spring Data JPA + Hibernate 执行保存方法,但不执行插入/更新语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56788079/

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