无法了解使用Spring Data JPA的EnableTransaction的行为

时间:2019-08-15 17:21:06

标签: spring spring-boot spring-data-jpa spring-transactions

我正在使用带有注释配置的Spring Data JPA。我不使用Spring Boot,因为我不想迷失在Spring Boot的魔力中。

我有下面的配置类。

package com.demo.app.config;

import statement ....

@Configuration
@ComponentScan("com.demo.app")
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.demo.app.repository")
public class AppConfig {

    @Bean
    DataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUsername("root");
        dataSource.setPassword("test");
        dataSource.setUrl("jdbc:mysql://localhost:3306/emp_db");
        return dataSource;
    }


    @Bean(name = "entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {
        LocalContainerEntityManagerFactoryBean em
                = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource());
        em.setPackagesToScan(new String[]{"com.demo.app.model"});

        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        em.setJpaProperties(additionalProperties());
        return em;
    }

    @Bean
    public PlatformTransactionManager transactionManager(final EntityManagerFactory emf) {
        final JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    }


    Properties additionalProperties() {
        Properties properties = new Properties();
        properties.setProperty("hibernate.hbm2ddl.auto", "create");
        properties.setProperty("hibernate.format_sql", "true");
        properties.setProperty("hibernate.show_sql", "true");
        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL57Dialect");

        return properties;
    }
}

上面的代码运行正常。

  • 即使我删除了@EnableTransactionManangement批注,它也可以正常工作。
  • 注释的含义是什么,如果应用程序即使没有注释也可以工作

  • 如果我更改方法名而不是transactionManager,则应用程序将无法抱怨transactionManager bean

  • 如果我添加@Bean(name="txManager")并将方法名称更改为txManager并在服务类中更改@Transactional(value="txManager"),那么应用程序也将找不到{{1 }}。即使我添加或删除@EnableTransactionManagement批注。

我不太确定它在内部如何工作以及如何调试这种情况。任何输入都会有很大帮助。

0 个答案:

没有答案