【问题标题】:Spring Data JPA + Hibernate do execute save methods, but don't execute insert/update statementsSpring Data JPA + Hibernate 执行保存方法,但不执行插入/更新语句
【发布时间】:2019-06-27 09:32:52
【问题描述】:

问题

问题在于,在每次使用 Maven 构建项目时,构建会随机生成一个工作 jar 或损坏的 jar。显然代码和配置都没有任何变化。

破碎是什么意思?

  • 破碎的罐子。 Job 正确地开始和结束,没有例外,没有任何类型的回滚,并且 CrudRepository 的所有保存方法都执行得很好。问题是,即使我在日志中看到选择语句来获取插入序列的下一个值,插入也不会被记录。检查数据库,插入不仅没有记录,而且实际上它们都从未执行过。事实上,相应的表仍然是空的!一个更重要的细节是传递给 CrudRepository 保存方法的实体设置了 ID。所有保存/更新都是这种情况,而不仅仅是其中一些。
  • 工作 JAR。 select 和 insert 语句都被正确记录,并且记录被插入到表中。

通常,每 5/6 次构建会生成 1 个工作 JAR,而 4/5 则被破坏。 损坏的和工作的 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.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

寻求帮助:

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

如果您需要 sn-p 代码问我,但通常它们是基本实体的正常保存,@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>

【问题讨论】:

  • 你使用 MySQL 吗?
  • 我忘记提供此信息:不,我使用的是 Oracle 11g
  • 首先,我将根据mvnrepository.com 使所有版本的依赖项相互兼容。例如 1) 你有版本 2.1.5.RELEASE 的 spring-data-jpa。让我们去mvnrepository,发现它依赖于版本5.2.17.Final的hibernate-core。你有 5.4.1.Final。 2)你有版本 5.1.5.RELEASE 的 spring-orm 和 here 它取决于版本 5.3.7.Final 的 hibernate-core
  • 感谢您的回答,我会尝试修复版本依赖关系,并用测试结果更新帖子
  • 没什么,同样的错误。我将使用更新的 pom 更新问题

标签: java spring hibernate spring-data-jpa spring-batch


【解决方案1】:

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

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

这些步骤解决了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 2016-12-20
    • 2015-11-25
    相关资源
    最近更新 更多