当前位置: 首页 > 知识库问答 >
问题:

Spring Data JPA+Hibernate确实执行save方法,但不执行INSERT/UPDATE语句

商佑运
2023-03-14

问题

问题是,在使用Maven构建项目的每一个版本中,该版本随机生成一个工作的jar或一个坏掉的jar。显然,在代码和配置方面都没有任何变化。

我说的破碎是什么意思?

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

通常情况下,每建造5/6,产生1个工作罐,而4/5是坏的。破碎的和工作的罐子是相同的二进制比较。

一个JAR一旦编译完成,如果它被破坏,那么每次执行都会被破坏,而不管它执行了多少次。工作的也一样。

我已经试过的

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

配置

我有一个spring批量项目,基于Spring Data JPA和Hibernate。批处理由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>

共有1个答案

汤修贤
2023-03-14

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

  • @bdshadow建议的版本恢复。
  • 我有一个@ConfigIguration类,@EnableJParePositories,entityManagerFactoryRef和transactionManager引用了该类中定义的bean。bean具有默认限定符entityManagerFactory和TransactionManager。我更改了限定符,并为其添加了符号@primary。

这些步骤解决了这个问题。

 类似资料:
  • 我有一个结构为INSERT语句的备份文件。我的方法是编写一个方法从文件中加载这些语句,并使用JDBC模板执行它们。 编辑:另外,SQL Developer如何处理这些长字符串文本?

  • 问题内容: 我在理解同步关键字功能时遇到了一些麻烦。根据Java文档和其他教程,可以说,当使用synced关键字时,在两个线程之间不可能在该方法的语句之间进行交织。 但是,请参见下面的代码。 据我了解,程序输出应始终以线程0和线程1不应交错的方式进行。但是多次执行这段代码后,我得到了交错输出。 请帮助我理解问题。 提前致谢.. 问题答案: 的关键字防止两个线程运行的是在同一对象上同步代码。 您的每

  • 问题内容: 假设表结构为。 我经常想更新现有记录,或者如果不存在则插入新记录。 本质上: 编写此代码的最佳方式是什么? 问题答案: 不要忘记交易。性能很好,但是简单的(IF EXISTS ..)方法非常危险。 当多个线程尝试执行插入或更新时,您很容易会遇到违反主键的情况。 @Beau Crawford和@Esteban提供的解决方案显示了总体思路,但容易出错。 为了避免死锁和PK违规,您可以使用以

  • 问题内容: 在MySQL中,我试图找到一种有效的方法来执行更新(如果表中已经存在一行),或者执行INSERT(如果该行不存在)。 到目前为止,我发现了两种可能的方法: 一个明显的例子:打开一个事务,选择以查找该行是否存在,如果不存在则进行INSERT,如果存在则进行UPDATE,提交事务 首先将IGNORE插入表中(如果该行已存在,则不会引发错误),然后进行更新 第二种方法避免了交易。 您认为哪一

  • 提交并执行。 据我所知-主要区别如下: 提交返回,如果我们可以观察到调用后任务中发生的exeption

  • 本文向大家介绍php+MySQL判断update语句是否执行成功的方法,包括了php+MySQL判断update语句是否执行成功的方法的使用技巧和注意事项,需要的朋友参考一下 update语句是PHP+MySQL中常用的操作,判断update语句是否执行成功是其中非常重要的一个环节。本文就以实例展示了php+MySQL判断update语句是否执行成功的方法。分享给大家供大家参考之用。具体方法如下: