Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring的上下文和Spring数据jpa_Java_Spring_Jpa_Spring Data Jpa - Fatal编程技术网

Java Spring的上下文和Spring数据jpa

Java Spring的上下文和Spring数据jpa,java,spring,jpa,spring-data-jpa,Java,Spring,Jpa,Spring Data Jpa,我正在处理一个导入模块,从excel文件中读取数据,填充实体并保存它们 现在我的问题是,我正在处理许多实体,然后我将数据库上的存储拆分为三种不同的方法 这是我的导入方法: @Transactional(propagation = Propagation.REQUIRES_NEW) private void readRowFromExcel(Row row){ for(Row row : sheet){ Customer customer = readCustomerF

我正在处理一个导入模块,从excel文件中读取数据,填充实体并保存它们

现在我的问题是,我正在处理许多实体,然后我将数据库上的存储拆分为三种不同的方法

这是我的导入方法:

@Transactional(propagation = Propagation.REQUIRES_NEW)
private void readRowFromExcel(Row row){

    for(Row row : sheet){

        Customer customer = readCustomerFromExcel(row)
        CustomerDeatails customerDetails = readCustomerDetailsFromExcel(row)    

        customerService.save(customer,customerDetails);

        MyEntity myEntity = readMyEntityFromExcel(row);

        myEntityService.save(myEntity)

    }   


}
这是客户服务中的保存方法

@Transactional(propagation = Propagation.REQUIRED)
public void save(Customer customer, CustomerDetails customerDetails){

            customerRepository.save(customer);
            customerDatailsRepository.save(customer);

}
这是myEntity服务中的保存方法:

@Transactional(propagation = Propagation.REQUIRED)
public void save(MyEntity myEntity){

    myEntityRepository.save(myEntity)

}
现在我的问题是如果我在下面的代码行中遇到异常

MyEntity MyEntity=readMyEntityFromExcelrow

实体customer和customerDetails已经是持久的,而我应该只在一切正常的情况下保存

我的spring-context.xml

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${db.driverClass}" />
        <property name="url" value="${db.connectionURL}" />
        <property name="username" value="${db.username}" />
        <property name="password" value="${db.password}" />
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" 
        p:entityManagerFactory-ref="entityManagerFactory">
        <property name="persistenceUnitName" value="myUnit" />
    </bean>

    <!-- 
    <bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
        <description>Allow spring to configure hibernate specific settings</description>
    </bean>
     -->
    <bean id="eclipseLinkJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
    </bean>

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
        p:dataSource-ref="dataSource" 
        p:persistenceUnitName="myUnit"
        p:jpaVendorAdapter-ref="eclipseLinkJpaVendorAdapter">
        <property name="jpaPropertyMap">
            <map>
                <entry key="eclipselink.cache.shared.default" value="false" />
                <entry key="eclipselink.weaving" value="false" />
            </map>
        </property>
        <property name="loadTimeWeaver">
            <bean
                class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
        </property>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager" />

如何解决此问题?

解决方案很简单:在进行任何数据库持久化之前,移动从excel读取的行:

@Transactional(propagation = Propagation.REQUIRES_NEW)
private void readRowFromExcel(Row row){

    for(Row row : sheet){
        //Reading from Excel
        Customer customer = readCustomerFromExcel(row)
        CustomerDeatails customerDetails = readCustomerDetailsFromExcel(row);
        MyEntity myEntity = readMyEntityFromExcel(row);

        //DB persisting
        customerService.save(customer,customerDetails);
        myEntityService.save(myEntity)
    }   

}

如果我试图保存实体时发生异常?因为您处于事务中,所有内容都应该回滚。如果不是这样,那么您的数据源可能不是JTA,或者您的DB表不支持事务。