2013-06-13 46 views
1

我看到很多問題,但他們的所有解決方案仍然不清楚。 這裏是我的設置 我的Spring上下文文件Spring - JPA -m @ Transactional沒有提交數據DB

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
    .. 
    ... 


    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 

    ... 
    ... 

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

    <bean id="entityManagerFactory1" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
     autowire="byName"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
     </property> 
     <property name="packagesToScan" value="com.my.dom.domain" /> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="hibernate.dialect"> 
        org.hibernate.dialect.Oracle10gDialect 
       </prop>    
       <prop key="hibernate.max_fetch_depth">3</prop> 
       <prop key="hibernate.jdbc.fetch_size">50</prop> 
       <prop key="hibernate.jdbc.batch_size">10</prop> 
       <prop key="hibernate.show_sql">true</prop> 
      </props> 
     </property> 
     <property name="persistenceUnitName" value="PersistenceUnit1"></property> 
    </bean> 

    <bean id="EntityManagerFactory2" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
     autowire="byName"> 
     <property name="dataSource" ref="myDataSource" /> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
     </property> 
     <property name="packagesToScan" value="com.my.dom.domain" /> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="hibernate.dialect"> 
        org.hibernate.dialect.H2Dialect 
       </prop> 
       <prop key="hibernate.max_fetch_depth">3</prop> 
       <prop key="hibernate.jdbc.fetch_size">50</prop> 
       <prop key="hibernate.jdbc.batch_size">10</prop> 
       <prop key="hibernate.show_sql">true</prop> 
      </props> 
     </property> 
    </bean> 
    .. 
    ...  


    <bean id="entityManager1" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory1" /> 
    </bean> 
    <tx:annotation-driven transaction-manager="entityManager1" /> 

    <bean id="EntityManager2" factory-bean="EntityManagerFactory2" factory-method="createEntityManager" autowire="byName" scope="prototype"/> 
    <tx:annotation-driven transaction-manager="EntityManager2" /> 


    <context:component-scan base-package="com.my.dom" /> 

    <jpa:repositories base-package="com.my.dom.repository" 
     entity-manager-factory-ref="entityManagerFactory" 
     transaction-manager-ref="transactionManager" /> 

    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" /> 
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/> 


</beans> 

所有的數據源和其他連接豆類到位並正常工作。

我的DAO代碼如下 package com.my.dom.dao;

@Component 
public class MyDAOImpl implements MyDAO { 

@PersistenceContext(unitName="PersistenceUnit1") 
EntityManager entityManager; // this is IAR EntityManager. 

@Override 
@Transactional 
public boolean saveMyGroups(
     List<MyGroups> theGroups) { 

    logger.info("Entering method - saveFuturetheGroups "); 
    //entityManager.getTransaction().begin(); 
    for(MyGroups pg : theGroups){ 
     MyGroups attachedENtity = entityManager.merge(pg); 
     entityManager.persist(pg); 
    } 
    //entityManager.getTransaction().commit(); 
    entityManager.flush(); 
    logger.info("Exiting method - saveFuturetheGroups "); 
    //List<MyGroups> savedEntities = futureProcGrpRepository.save(theGroups); 
    return true; 
} 

}

我所有的CGLIB並在類路徑aopalliance1.0.jars在Spring+JPA @Transactional not committing

建議還是我的代碼沒有提交修改爲DB。任何幫助指針都會非常有幫助。

該代碼顯示了select和insert sql語句,並沒有拋出異常但代碼沒有提交。 @Transactional註釋中是否存在任何問題?

可以定義多個entitymanagers在這裏的任何問題?


確定什麼我發現是,如果我使用 @Transactional(傳播= Propagation.REQUIRES_NEW)

對我的方法的前頭提交更改!但根據我的理解,傳播的默認值是'REQUIRED',任何方式都將啓動新的轉換,並應在最後提交?任何指針,我現在真的很困惑!

感謝 HK

剛一說明,我從JUnit測試情況下運行這一點,是有可能,它明確地回滾的變化?我看到類似日誌

INFO : org.springframework.test.context.transaction.TransactionalTestExecutionListener - Rolled back transaction after test execution for test context [[[email protected] testClass = ProcessingGroupsTestCase, testInstance = null(com.wellmanage.dos.processingGroups.ProcessingGroupsTestCase), testMethod = [email protected], testException = [null], mergedContextConfiguration = [[email protected] testClass = ProcessingGroupsTestCase, locations = '{classpath:applicationContext.xml}', classes = '{}', activeProfiles = '{}', contextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader']]] 

感謝 以下HK

+0

假設你的'Entity'類沒有被定義爲'insert = false,update = false'等 – user75ponic

+0

嗨,在我的實體中沒有這樣的屬性。 – user2482019

+0

是否存在從事務塊 –

回答

0

你是specifiy您的代碼

@Transactional("entityManager1") 
public boolean saveMyGroups(
+0

拋出的任何錯誤但是,當我定義了一個引用「entityManager」併爲其添加persistenceUnit名稱時,爲什麼需要在代碼上定義transactionManager? – user2482019

+0

當我在Transactional中使用entityManager1時,出現以下異常。 「testException = org.springframework.dao.InvalidDataAccessApiUsageException:找不到匹配的PlatformTransactionManager bean,用於限定符'entityManager' - 既不限定匹配也不匹配bean;;嵌套異常是java.lang.IllegalStateException:找不到匹配的PlatformTransactionManager bean,用於限定符'entityManager1' - 無論限定符匹配還是bean名稱匹配!,......'{classpath:applicationContext.xml}',classes ='{}',activeProfiles ='{}',contextLoader ='... DelegatingSmartContextLoader']] ]」 – user2482019

4

玉傢伙事務管理!我所有的愚蠢......我相信我應該承認它。所有的時候我通過TestCase運行整個DAO和服務,而我在TestCase中忽略了以下內容。

@ContextConfiguration(locations = {"classpath:applicationContext.xml"}) 
@TransactionConfiguration(transactionManager="transactionManager", defaultRollback=true) 
@Transactional 

defaultRollback = true是罪魁禍首。

我學到了什麼教訓。永遠不要忽視任何代碼,並總是試圖從代碼的開頭找到問題。

因此,爲了使Spring與JPA 一起工作 - 擁有合適的上下文條目(如我的示例中所示) - 在我的DAO中使用@Transactional。

你應該全部設置。

感謝 HK

2

默認情況下,defaultRollback設置你JUnit測試,這意味着真實的,即使你不指定@TransactionConfiguration,通過JUnit測試更新後的數據將被回滾。

明確設置defaultRollback = false將解決此問題。

@TransactionConfiguration(transactionManager的=「transactionManager的」,defaultRollback = FALSE)

0

在我而言,你只是不希望把@Transactional註釋上的測試本身(或它在類),它會解決這個問題,而不必包括:

@TransactionConfiguration(transactionManager="transactionManager", defaultRollback=false) 

這可能使單元測試困難,並且是「真」默認情況下,一個很好的理由。

所以,只要讓你的控制器層方法@Transactional,不要在測試中做到這一點 - 然後他們會看到修改後的數據。