JPA Transaction - CrudRepository #save(List) not rolled back

Ani :

I'm using Spring Boot 1.5.9 with spring-boot-starter-data-jpa and Camel 2.20.1. As input I get an XML file with a sequence of elements, which I unmarshal with JAXB and after that I aggregate them to a list of elements.

For that I defined a Element class where I associate a root element for JAXB and annotated it as a JPA entity.

@Entity
@Table (name="tblElement", schema="comp")
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Element implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    @Column (name="name")
    @XmlElement(required = true)
    private String name;

    public void Element(){}

    //getter and setter methods
    ...
} 

So my camel route processes a list of entries which I want to store to a MySQL database (version: 5.1.73).

@Component
public class CompRoute extends RouteBuilder {

    @Autowired
    private ElementDao elementDao;

    @Override
    public void configure() throws Exception {
        DataFormat jaxbDataFormat = new JaxbDataFormat("com.comp.beans");

        from(file:src/test/resources/input)
                .convertBodyTo(byte[].class, "UTF-8")
                .split().tokenizeXML("element") 
                .unmarshal(jaxbDataFormat) 
                .setProperty("SplitSize", simple("${header.CamelSplitSize}"))

                .aggregate(constant(true), new ArrayListAggregationStrategy()) 
                    .completionSize(simple("${property.SplitSize}"))

                .bean(elementDao, "insertElementList");
    }
}

I'm not so familiar with JPA and the transaction manager, so I configured it according these documentations:

https://spring.io/guides/gs/accessing-data-jpa/

https://docs.spring.io/spring-data/jpa/docs/1.5.0.RELEASE/reference/html/jpa.repositories.html

application.properties

spring.datasource.url=jdbc:mysql://compserver:3306/comp
spring.datasource.username=user
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver 

JpaConfig.java

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackageClasses = CompApplication.class)
class JpaConfig {
    @Autowired
    DataSource dataSource;

    @Bean
    public EntityManagerFactory entityManagerFactory() {
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(false);

        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);

        String entities = ClassUtils.getPackageName(CompApplication.class);
        factory.setPackagesToScan(entities);
        factory.setDataSource(dataSource);
        factory.afterPropertiesSet();

        return factory.getObject();
    }

    @Bean
    @Qualifier (value = "jpaTransactionManager")
    public PlatformTransactionManager transactionManager() {
        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory());
        return txManager;
    }
}

CompApplication.java

@SpringBootApplication
public class CompApplication {
  public static void main(String[] args) {
          SpringApplication app = new SpringApplication(CompApplication.class);
          app.setBannerMode(Banner.Mode.OFF);
          app.run(args);
  }

}

ElementDao.java

@Service
public class ElementDao {
    @Autowired
    ElementRepository elementRepository;

    @Transactional (transactionManager = "jpaTransactionManager", readOnly = false, propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
    public void insertElementList(Exchange exchange) {
        if(exchange.getIn().getBody() instanceof List) {
             List<Element> elements= convertListToElementList(exchange.getIn().getBody(List.class));
             if (elements != null) {
                 elementRepository.save(elements);
             }
        }
    }
}

ElementRepository.java

@Repository
public interface ElementRepository extends CrudRepository<Element, Long> {

}

しかし、私のトランザクション構成は正しく機能していません。たとえば、5番目の要素の格納中にエラーが発生した場合、トランザクション全体はロールバックされません。要素を挿入しないでください。ただし、最初の4つの要素は保存され、コミットされます。

私はこの行動を理解していませんか?データベースの格納中に例外が発生したときに、操作全体がロールバックされるようにサービス#insertElementListをトランザクションに設定するにはどうすればよいですか?

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>  
     <groupId>com.company</groupId>
     <artifactId>company</artifactId>
     <version>0.0.1</version>
     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
         <version>1.5.9.RELEASE</version>
     </parent> 
     <properties>
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
       <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
       <java.version>1.8</java.version>
       <camel.version>2.20.1</camel.version>
     </properties>
     <dependencies>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-jpa</artifactId>
         </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-spring-boot-starter</artifactId>
             <version>${camel.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-jdbc</artifactId>
             <version>${camel.version}</version>
         </dependency>
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
             <version>5.1.45</version>
         </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-jaxb</artifactId>
             <version>2.20.0</version>
         </dependency>    
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-artemis</artifactId>
         </dependency>   
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-jms</artifactId>
             <version>${camel.version}</version>
         </dependency>   
         <dependency>
             <groupId>com.ibm</groupId>
             <artifactId>com.ibm.mq.allclient</artifactId>
             <version>9.0.0.1</version>
         </dependency>
          <dependency>
             <groupId>net.logstash.logback</groupId>
             <artifactId>logstash-logback-encoder</artifactId>
             <version>4.8</version>
         </dependency>    
         <dependency>
             <groupId>ch.qos.logback</groupId>
             <artifactId>logback-core</artifactId>
             <version>1.1.8</version>
         </dependency>     
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
         </dependency>  
         <dependency>
             <groupId>commons-io</groupId>
             <artifactId>commons-io</artifactId>
             <version>2.5</version>
         </dependency>
     </dependencies>
 </project>
年:

I found the solution. The problem was the database and not my configuration. The MySql table was of type MyISAM, which does not support transactions and roll back. So I converted the table to InnoDB and now it works - when the transaction fails, all is rolled back.

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Spring CrudRepository .orElseThrow()

分類Dev

Spring CrudRepositoryの例外

分類Dev

Spring JPAにCrudRepositoryを注入する方法は?

分類Dev

Spring-Data JPA CrudRepositoryはIterableを返します。これをリストにキャストしてもよろしいですか?

分類Dev

Spring Data JPAのCrudRepositoryインターフェースとJpaRepositoryインターフェースの違いは何ですか?

分類Dev

xSpring Data JPAを使用してSpringでCrudRepositoryの@Id文字列を取得するにはどうすればよいですか?

分類Dev

CrudRepositoryを拡張し、Spring Data JPAでカスタムメソッドの独自の実装を作成する

分類Dev

Spring Boot + JPA-CrudRepositoryを更新してから、

分類Dev

Spring Data JPA、CrudRepositoryインターフェースで@EntityGraphをパラメーター化

分類Dev

複数の日付間検索をSpringData JPAのCrudRepositoryと組み合わせる方法は?

分類Dev

複数の日付間検索をSpringData JPAのCrudRepositoryと組み合わせる方法は?

分類Dev

Is the CrudRepository .delete() method transactional?

分類Dev

Spring Data JPAを使用したJpaRepositoryとCrudRepositoryの違いは正確には何ですか?

分類Dev

Why is CrudRepository ignoring a @Column?

分類Dev

Why is CrudRepository ignoring a @Column?

分類Dev

Spring JPA transaction over multiple methods

分類Dev

JPA Exception : No externally managed transaction is currently active for this thread

分類Dev

Using transaction.atomic to roll back recursive form validation + save

分類Dev

How to roll back a transaction on error in PostgreSQL?

分類Dev

How to add the value of two dice rolled

分類Dev

Solr - DataImportHandler: Indexing failed. Rolled back all changes

分類Dev

Spring Data JPA: Pageable query rollbacks transaction

分類Dev

Spring Declarative Transaction Rollback fails for even after stating to roll back

分類Dev

Spring Data JPA(CrudRepository)-BeanCreationException:フィールドを自動配線できませんでした

分類Dev

Spring Data Jpa から CrudRepository を使用するときに NoSuchBeanDefinitionException を修正する方法は?

分類Dev

CrudRepository の NullPointerException

分類Dev

ClassNotFoundException CrudRepository

分類Dev

CrudRepositoryを使用したSpringBoot JPA

分類Dev

別のOracleスキーマ用のSpringBoot JPA CrudRepository

Related 関連記事

  1. 1

    Spring CrudRepository .orElseThrow()

  2. 2

    Spring CrudRepositoryの例外

  3. 3

    Spring JPAにCrudRepositoryを注入する方法は?

  4. 4

    Spring-Data JPA CrudRepositoryはIterableを返します。これをリストにキャストしてもよろしいですか?

  5. 5

    Spring Data JPAのCrudRepositoryインターフェースとJpaRepositoryインターフェースの違いは何ですか?

  6. 6

    xSpring Data JPAを使用してSpringでCrudRepositoryの@Id文字列を取得するにはどうすればよいですか?

  7. 7

    CrudRepositoryを拡張し、Spring Data JPAでカスタムメソッドの独自の実装を作成する

  8. 8

    Spring Boot + JPA-CrudRepositoryを更新してから、

  9. 9

    Spring Data JPA、CrudRepositoryインターフェースで@EntityGraphをパラメーター化

  10. 10

    複数の日付間検索をSpringData JPAのCrudRepositoryと組み合わせる方法は?

  11. 11

    複数の日付間検索をSpringData JPAのCrudRepositoryと組み合わせる方法は?

  12. 12

    Is the CrudRepository .delete() method transactional?

  13. 13

    Spring Data JPAを使用したJpaRepositoryとCrudRepositoryの違いは正確には何ですか?

  14. 14

    Why is CrudRepository ignoring a @Column?

  15. 15

    Why is CrudRepository ignoring a @Column?

  16. 16

    Spring JPA transaction over multiple methods

  17. 17

    JPA Exception : No externally managed transaction is currently active for this thread

  18. 18

    Using transaction.atomic to roll back recursive form validation + save

  19. 19

    How to roll back a transaction on error in PostgreSQL?

  20. 20

    How to add the value of two dice rolled

  21. 21

    Solr - DataImportHandler: Indexing failed. Rolled back all changes

  22. 22

    Spring Data JPA: Pageable query rollbacks transaction

  23. 23

    Spring Declarative Transaction Rollback fails for even after stating to roll back

  24. 24

    Spring Data JPA(CrudRepository)-BeanCreationException:フィールドを自動配線できませんでした

  25. 25

    Spring Data Jpa から CrudRepository を使用するときに NoSuchBeanDefinitionException を修正する方法は?

  26. 26

    CrudRepository の NullPointerException

  27. 27

    ClassNotFoundException CrudRepository

  28. 28

    CrudRepositoryを使用したSpringBoot JPA

  29. 29

    別のOracleスキーマ用のSpringBoot JPA CrudRepository

ホットタグ

アーカイブ