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

时间:2019-06-27 09:32:52

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

问题

问题在于,在使用Maven进行的每个项目构建中,该构建都会随机生成一个工作罐或损坏的罐。显然,代码或配置都没有任何改变。

我的意思是坏了吗?

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

通常,每5/6个构建,生成1个有效的JAR,而4/5被破坏。 破损的罐子和工作罐子与二进制比较相同。

一旦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

寻求帮助:

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

如果您需要一小段代码,请问我,但是一般来说,除了基本实体外,它们都是正常的,@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>

1 个答案:

答案 0 :(得分:0)

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

  • @bdshadow建议的版本版本。
  • 我有一个@Configiguration类,带有@EnableJpaRepositories,其中 entityManagerFactoryRef transactionManager 引用了此类中定义的bean。 Bean具有默认的限定符 entityManagerFactory transactionManager 。我更改了限定词,并在它们中添加了@Primary标记。

这些步骤解决了该问题。