Spring Data JPA + Hibernate выполняет методы сохранения, но не выполняет операторы вставки / обновления - PullRequest
1 голос
/ 27 июня 2019

Issue

Проблема в том, что при каждой сборке проекта с Maven сборка случайным образом создает рабочий или сломанный файл. Очевидно, что нет никаких изменений ни в коде, ни в конфигурации.

Что я имею в виду с разбитым?

  • Сломанный кувшин. Задание запускается и заканчивается правильно, без исключений, без какого-либо отката, и все методы сохранения CrudRepository выполняются просто отлично. Проблема заключается в том, что даже если я вижу в журнале операторы выбора для получения следующего значения последовательностей для вставок, вставки никогда не регистрируются. При проверке БД вставки не только не регистрируются, но фактически все они никогда не выполняются. На самом деле соответствующие таблицы остаются пустыми! Еще одной важной деталью является то, что сущности, переданные в методы сохранения CrudRepository, имеют установленные идентификаторы. Это касается всех операций сохранения / обновления, а не только некоторых из них.
  • Рабочий JAR. Операторы выбора и вставки записываются правильно, а записи вставляются в таблицы.

Обычно, каждые 5/6 сборок генерируется 1 рабочий JAR, а 4/5 не работают. Разбитые и рабочие банки идентичны двоичному сравнению.

Как только JAR скомпилирован, если он будет прерван, каждое выполнение будет прервано, независимо от того, сколько раз оно было выполнено. То же самое касается рабочего.

Что я уже пробовал

  1. Изменение версий Spring / Hibernate
  2. Компиляция на разных машинах
  3. Замена CrudRepository на JpaRepository
  4. Принудительное принятие с помощью saveAndFlush (что приводит к генерации исключения)

Конфигурация

У меня есть Spring Batch Project, основанный на Spring Data JPA и Hibernate. Пакет выполняется файлом sh. Как видно из конфигурации, по причинам отладки у меня для параметра hibernate.show_sql установлено значение true. База данных Oracle 11g.

РОМ:

    <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 для одной и той же версии. Проблема все еще там.

Обновление пом

 <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 голосов
/ 01 июля 2019

Я решил проблему с помощью следующих шагов:

  • Версии Revion, предложенные @ bdshadow.
  • У меня был класс @Configiguration, с @EnableJpaRepositories, с entityManagerFactoryRef и TransactionsManager , указывающим на bean-компонент, определенный в этом классе. У bean-компонентов были квалификаторы по умолчанию entityManagerFactory и transactionManager . Я изменил классификаторы и добавил к ним обозначение @Primary.

Эти шаги решили проблему.

...