0

我試圖將spring xml配置轉換爲java配置。這通過XML配置完美工作。但是,如果我使用java配置初始化程序,則會引發以下異常。當它嘗試運行JQL時會發生這種情況。應用程序雖然啓動正確(所有JPA映射初始化)。InvalidDataAccessApiUsageException:執行更新/刪除查詢Spring XML到Java配置

org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query 
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:410) [spring-orm-4.1.5.RELEASE.jar:4.1.5.RELEASE] 
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:216) [spring-orm-4.1.5.RELEASE.jar:4.1.5.RELEASE] 
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:417) [spring-orm-4.1.5.RELEASE.jar:4.1.5.RELEASE] 
at org.springframework.dao.support.ChainedPersistenceExceptionTranslat 

以下是我的持久化初始化類。閱讀的位提示我這與交易沒有正確啓動有關。我已經將調試點放到了這些方法中的每一個,但是在服務器啓動或以後的任何時候,transactionManager方法都不會被執行。我不知道我究竟做錯了:(。完美持久時,通過初始化的persistence.xml相同的基於代碼的作品。在道

訪問該方法
public void updateById(final Long id) { 

     final String sqlQuery = "UPDATE testtable w SET w.LAST_ACCESSED = :date WHERE w.testtable_ID = :testid"; 
     final Query query = dao.createNativeQuery(sqlQuery); 
     query.setParameter("date", new Date()); 
     query.setParameter("testid", id); 
     query.executeUpdate(); 
    } 
+0

這些方法對於調試點......這些方法是豆宣言。所以這些只會在啓動過程中被擊中。關於例外情況,當您確切地知道這個錯誤時,我的意思是在做什麼操作時,您是否也可以使用該代碼。 – pvpkiran

+0

謝謝,據我所知,服務器啓動調試模式,我打了其他兩個bean初始化方法,但tx初始化方法。這就是爲什麼我懷疑我錯過了事務初始化。編輯問題以顯示JQL方法。再一次,這對xml配置有效。 – Charith

+0

在這個方法上使用'@Transactional'並試一試。 – pvpkiran

回答

1

最後,當發生

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(basePackages = "au.mypkg") 
public class DatabaseConfig { 


    @Bean(name = "dataSource") 
    @Primary 
    public DataSource dataSource() throws Exception { 
     Context ctx = new InitialContext(); 
     return (DataSource) ctx.lookup("java:jboss/datasources/mydb"); 
    } 

    @PersistenceContext(unitName = "persistenceUnit") 
    @Primary 
    @Bean(name = "entityManagerFactory") 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws Exception { 
    .......... 

    @Primary 
    @Bean(name = "transactionManager") 
    public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { 
     final JtaTransactionManager transactionManager = new JtaTransactionManager(); 
     transactionManager.setTransactionManagerName(JBOSS_TRANSACTION_MANANGER); 
     return transactionManager; 
    } 

錯誤想知道這是怎麼回事,因爲它沒有達到調試點,EnableTransactionManagement強制爲你自動配置事務,所以如果你的事務管理器配置了默認名字,在我的情況下,它不會嘗試調用我的方法來配置事務。解決此問題的唯一方法是爲transac使用不同的名稱並將該ref作爲enableJPARepository註釋的參數傳遞。如果使用其中一個默認名稱,則不會進行此調用。

@Primary 
@Bean(name = "myRealTransactionManager") 
public PlatformTransactionManager transactionManager() { 
    final JtaTransactionManager transactionManager = new JtaTransactionManager(); 
    transactionManager.setTransactionManagerName(JBOSS_TRANSACTION_MANANGER); 
    return transactionManager; 
} 

..然後

@EnableJpaRepositories(basePackages = "au.mypkg", transactionManagerRef = "myRealTransactionManager" 

的另一個問題是我所用過的setDataSource而不是setJtaDataSource上LocalContainerEntityManagerFatoryBean。

3

我遇到了一些問題,並通過在執行刪除或更新的服務方法上添加@Transactional註釋來解決問題。 在我的情況是,調用它通過我認爲執行刪除由JPQL這樣的存儲庫方法的方法可以解決你的問題太多:

@Modifying  
@Query("delete from OtherPayment otherPayment " + 
     "where otherPayment.otherPaymentParam.id = :otherPaymentParamId")  
void deleteByOtherPaymentParamId(@Param("otherPaymentParamId") Long otherPaymentParamId); 
+0

它已經用@Transactional註解了。謝謝 – Charith

相關問題