2015-03-31 49 views
0

我有一個獨立的應用程序,我試圖填充數據庫。 我的應用程序的配置是這樣的:Spring @Transactional不工作在獨立的應用程序

@Configuration 
@EnableTransactionManagement 
@PropertySource(value = { "classpath:classpath property file" }) 
@ComponentScan(basePackages = { my packages to scan }) 
public class PersistenceJPAConfig {  

    @Bean 
    public EntityManagerFactory entityManagerFactoryBean() { 
     LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
     em.setDataSource(dataSource()); 
     em.setPackagesToScan(new String[] { packages to scan}); 

     JpaVendorAdapter vendorAdapter = jpaVendorAdapter(); 
     em.setJpaVendorAdapter(vendorAdapter); 
     em.setJpaProperties(additionalProperties()); 
     em.afterPropertiesSet(); 

     return em.getObject(); 
    } 

    @Bean 
    public JpaVendorAdapter jpaVendorAdapter() { 
     HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); 
     jpaVendorAdapter.setDatabase(Database.ORACLE); 
     return jpaVendorAdapter; 
    } 

    @Bean 
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 

    @Bean 
    public DataSource dataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver"); 
     dataSource.setUrl(url); 
     dataSource.setUsername(dbUser); 
     dataSource.setPassword(dbPassword); 
     return dataSource; 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager() { 
     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(entityManagerFactoryBean()); 

     return transactionManager; 
    } 

    @Bean 
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { 
     return new PersistenceExceptionTranslationPostProcessor(); 
    } 

    Properties additionalProperties() { 
     return new Properties() { 
      { // Hibernate Specific: 
       setProperty("hibernate.hbm2ddl.auto", "validate"); 
       setProperty("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect"); 
      } 
     }; 
    } 
} 

然而,當我試圖堅持在數據庫的東西,註釋與錯誤而失敗: 異常線程「main」 javax.persistence.TransactionRequiredException:可用

無交易的EntityManager

在生成的錯誤堆棧中,我沒有看到正在應用的事務性建議。

包含事務註釋的文件是這樣的:

import org.springframework.transaction.annotation.Transactional; 

@Service 
public class MyService { 

    @Autowired 
    private MyDao myDao; 

    @Transactional 
    public void save(MyEntity e) { 
     myDao.save(e); 
    } 
} 

的MyDao類是這樣的:

@Repository 
public class MyDao { 
    @PersistenceContext 
    private EntityManager entityManager; 

    public void save(MyEntity e) { 
     entityManager.persist(e); 
    } 

} 

我打電話從我的主要方法的功能如下:

public static void main(String[] args) { 

    try (AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext()) { 
     ctx.scan(CONFIG_PACKAGE); 
     ctx.refresh(); 
     myService = ctx.getBean(MyService.class); 
     Thread.sleep(10 * 1000); 
     myService.save(entity); 
     ... 
} 

堆棧跟蹤看起來像這樣(編輯刪除太特定ic痕跡屬於我的代碼):

Exception in thread "main" javax.persistence.TransactionRequiredException: No transactional EntityManager available 
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:275) 
at com.sun.proxy.$Proxy27.persist(Unknown Source) 
at mypackage.MyDao.save(MyDao.java:42) 
at mypackage.MyDao$$FastClassBySpringCGLIB$$758201c8.invoke(<generated>) 
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653) 
at mypackage.MyDao$$EnhancerBySpringCGLIB$$9bd3b4fc.save(<generated>) 
at mypackage.MyService.save(MyService.java:176) 
at mypackage.MyService$$FastClassBySpringCGLIB$$5c0a03f6.invoke(<generated>) 
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:649) 
at mypackage.Run.main(Run.java:109) 

任何人都可以請幫助我,即我可能做錯了什麼? 感謝您的幫助

+0

你可以發佈完整的堆棧跟蹤嗎?另外,來自'main'方法的'entity'在哪裏? – woemler 2015-03-31 01:36:53

+0

添加堆棧跟蹤。我在保存它之前在main方法中創建實體對象。 – 2015-03-31 13:02:54

+0

您是否在您的EntityManager聲明中嘗試過使用'@ Autowired'而不是'@ PersistenceContext'? – woemler 2015-03-31 13:36:26

回答

0

您需要在配置類中添加@EnableJpaRepositories(basePackages = "base package")註釋。

+0

補充,沒有工作。此外,不確定該註釋如何有助於事務管理?你能否詳細說明一下? – 2015-03-31 13:05:25