【问题标题】:How to implement JPA transaction with Spring Boot application?如何使用 Spring Boot 应用程序实现 JPA 事务?
【发布时间】:2016-11-04 07:40:54
【问题描述】:

如何使用 Spring Boot 应用程序在单个事务中插入以下对象。如果对象下方的任何人未能插入该事务回滚。

clientInBoundFilesService.saveClientInBoundFiles(clientInBoundFiles);
icdCodeService.saveICDCode(icdCode);
cptCodeService.saveCPTCode(cptCode);
insuranceService.saveInsurance(insurance);
referingProviderService.saveReferingProvider(referingProvider);

这是我的 pom.xml

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.5.RELEASE</version>
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <start-class>org.sam.application.Application</start-class>
        <java.version>1.6</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.10</version>
        </dependency>

这是我的 JpaRepositoryFactory.java 。

@Component
public class JpaRepositoryFactory {

    @PersistenceContext
    private EntityManager entityManager;

    public <T> T getRepository(Class clazz) {
        notNull(clazz);
        notNull(entityManager);
        T crudRepository = (T) new SimpleJpaRepository(clazz, entityManager);
        return crudRepository;
    }
}

这是我的服务类

@Service
public class ClaimDetailService {

    private JpaRepositoryFactory jpaRepositoryFactory;
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    @Autowired
    public ClaimDetailService(JpaRepositoryFactory jpaRepositoryFactory) {
        this.jpaRepositoryFactory = jpaRepositoryFactory;
    }

    @Autowired
    public void setDataSource(DataSource dataSource) {
        this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
    }

    @Transactional
    public void saveClaimDetail(ClaimDetail claimDetail) {
        JpaRepository<ClaimDetail, Long> mailAuditLogLongJpaRepository = jpaRepositoryFactory.getRepository(ClaimDetail.class);
        mailAuditLogLongJpaRepository.save(claimDetail);
    }

}

【问题讨论】:

    标签: spring jpa spring-boot transactions


    【解决方案1】:
    clientInBoundFilesService.saveClientInBoundFiles(clientInBoundFiles);
    icdCodeService.saveICDCode(icdCode);
    cptCodeService.saveCPTCode(cptCode);
    insuranceService.saveInsurance(insurance);
    referingProviderService.saveReferingProvider(referingProvider);
    

    用一些方法 eq 包装你的代码。 (您可以创建一个新服务并注入所需的服务)

    @Transactional
    void allInOneTransaction(){
         clientInBoundFilesService.saveClientInBoundFiles(clientInBoundFiles);
         icdCodeService.saveICDCode(icdCode);
         cptCodeService.saveCPTCode(cptCode);
         insuranceService.saveInsurance(insurance);
         referingProviderService.saveReferingProvider(referingProvider);
    }
    

    默认@Transactional 传播是Propagation.REQUIRED -> 支持当前事务,如果不存在则创建一个新事务。

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 2023-03-08
      • 2020-12-21
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 2022-01-27
      • 1970-01-01
      • 2017-07-02
      相关资源
      最近更新 更多