首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swing + Spring +@ transactions =未启动事务

Swing + Spring +@ transactions =未启动事务
EN

Stack Overflow用户
提问于 2014-03-20 11:35:19
回答 1查看 433关注 0票数 1

我正在研究在Swing应用程序上使用Spring的可能性,并应用MVC概念。

现在,我正在尝试创建一个@ transaction方法,但它不会启动事务。

这是我的密码:

代码语言:javascript
复制
@Component
public class MainFormController {

    @Autowired
    private MainFormFrameView view;

    @Autowired
    private MyService service;

    public MainFormController() {
    view.button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            doSomethingInTransaction();
        }
    });
    }

    @Transactional
    public void doSomethingInTransaction() {
        if (!TransactionSynchronizationManager.isActualTransactionActive()) {
           throw new IllegalStateException("No active transaction!!!!");
        }
        service.doSomethingOverTheTransaction();
    }
}

这是我的配置:

代码语言:javascript
复制
@Configuration
@ComponentScan(basePackages = "br.com.jjw.pdv")
@EnableTransactionManagement
public class AppContextConfiguration {

    @Bean
    public DataSource dataSource() throws PropertyVetoException {
        ComboPooledDataSource ret = new ComboPooledDataSource();

        ret.setDriverClass(jdbcDriver.class.getName());
        ret.setJdbcUrl("jdbc:hsqldb:file:dados.hsql");
        ret.setUser("sa");
        ret.setPassword("");

        return ret;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws PropertyVetoException {
        LocalContainerEntityManagerFactoryBean ret = new LocalContainerEntityManagerFactoryBean();
        ret.setDataSource(dataSource());
        ret.setJpaDialect(jpaDialect());

        EclipseLinkJpaVendorAdapter adapter = new EclipseLinkJpaVendorAdapter();
        adapter.setDatabase(Database.HSQL);

        ret.setJpaVendorAdapter(adapter);
        ret.setPersistenceXmlLocation("classpath:META-INF/persistence.xml");
        ret.setPersistenceUnitName("jjw-pdv-unit");
        ret.setLoadTimeWeaver(new InstrumentationLoadTimeWeaver());

        return ret;
    }

    @Bean
    public JpaDialect jpaDialect() {
        return new EclipseLinkJpaDialect();
    }

    @Bean
    public PersistenceAnnotationBeanPostProcessor persistenceAnnotationBeanPostProcessor() {
        return new PersistenceAnnotationBeanPostProcessor();
    }

    @Bean
    public JpaTransactionManager transactionManager() throws PropertyVetoException {
        JpaTransactionManager ret = new JpaTransactionManager();
        ret.setEntityManagerFactory(entityManagerFactory().getNativeEntityManagerFactory());
        ret.setJpaDialect(jpaDialect());
        return ret;
    }

}

单击该按钮时,doSomethingInTransaction()方法将引发异常:

代码语言:javascript
复制
 IllegalStateException("No active transaction!!!!");

为什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-20 11:55:27

Spring AOP是基于代理的,内部调用是不建议的。

您需要对spring提供的代理进行调用,如下所示

代码语言:javascript
复制
 SomeTransactionalBean bean = 
           applicationContext.getBean(SomeTransactionalBean.class);

 bean.doSomethingInTrasanction();

例如,将@Transactional注释放在服务方法上。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22531728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档