Spring JPA 和spring-JDBC-模板的@Transactional 的启动配置
Spring boot configuration for @Transactional for both JPA and spring-JDBC-templete
在我的项目中,我同时使用了 JPA 和 spring-jdbc-template & NamedParameterTemplate。
我需要获得两者的交易支持。
那么如何为 JPA 和 spring-JDBC 配置 @Transactional 呢?
这是我用来配置它们的 2 个 classes。
Class 数字 1:PersistenceConfiguration
这是声明应启用事务管理的 class。
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"com.google.product.repository"},
excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = "com.google.product.repository.mongoRepository.*.*Repository"))
public class PersistenceConfiguration {
@Autowired
private DataSource dataSource;
@Autowired
private Properties entityManagerProperties;
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource);
em.setPackagesToScan("com.google.product.model");
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
em.setJpaProperties(entityManagerProperties);
return em;
}
}
Class 数字 2:ProdDatabaseConfiguration
这是 class 声明 beans releted 到 JDBC & JPA。例如 primaryJdbcTemplate ,secondaryJdbcTemplate 和 entityManagerProperties。
@Configuration
@PropertySource({"classpath:database-prod.properties"})
@Profile("prod")
public class ProdDatabaseConfiguration {
private static final Logger LOG = LoggerFactory.getLogger(ProdDatabaseConfiguration.class);
@Value("${jdbc.jndiName}")
private String jndiName;
@Value("${hibernate.dialect}")
private String hibernateDialect;
@Value("${hibernate.show_sql}")
private String hibernateShowSql;
@Value("${hibernate.cache.use_second_level_cache}")
private String hibernateSecondLevelCache;
@Value("${hibernate.cache.use_query_cache}")
private String hibernateQueryCache;
@Value("${jadira.usertype.databaseZone}")
private String databaseZone;
@Value("${jadira.usertype.javaZone}")
private String javaZone;
@Value("${mongo.jndiName}")
private String mongoJndiName;
@Bean
public DataSource dataSource() {
JndiDataSourceLookup jndiDataSourceLookup = new JndiDataSourceLookup();
return jndiDataSourceLookup.getDataSource(jndiName);
}
@Bean(name = "entityManagerProperties")
public Properties additionalProperties() {
final Properties hibernateProperties = new Properties();
hibernateProperties.setProperty("hibernate.hbm2ddl.auto", "none");
hibernateProperties.setProperty("hibernate.dialect", hibernateDialect);
hibernateProperties.setProperty("hibernate.show_sql", hibernateShowSql);
hibernateProperties.setProperty("hibernate.cache.use_second_level_cache", hibernateSecondLevelCache);
hibernateProperties.setProperty("hibernate.cache.use_query_cache", hibernateQueryCache);
hibernateProperties.setProperty("jadira.usertype.databaseZone", databaseZone);
hibernateProperties.setProperty("jadira.usertype.javaZone", javaZone);
return hibernateProperties;
}
@Bean(name = "primaryJdbcTemplate")
public JdbcTemplate primaryJdbcTemplate() {
JndiDataSourceLookup jndiDataSourceLookup = new JndiDataSourceLookup();
return new JdbcTemplate(jndiDataSourceLookup.getDataSource(jndiName));
}
@Bean(name = "secondaryJdbcTemplate")
public NamedParameterJdbcTemplate secondaryJdbcTemplate() {
JndiDataSourceLookup jndiDataSourceLookup = new JndiDataSourceLookup();
return new NamedParameterJdbcTemplate(jndiDataSourceLookup.getDataSource(jndiName));
}
因为您只使用一个数据源,所以您可以删除所有配置并只使用 spring.datasource 属性。
事务也将开箱即用,因为您将只有此数据源。
在官方文档中阅读有关此主题的更多信息:
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-sql
在我的项目中,我同时使用了 JPA 和 spring-jdbc-template & NamedParameterTemplate。 我需要获得两者的交易支持。
那么如何为 JPA 和 spring-JDBC 配置 @Transactional 呢?
这是我用来配置它们的 2 个 classes。
Class 数字 1:PersistenceConfiguration 这是声明应启用事务管理的 class。
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"com.google.product.repository"},
excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = "com.google.product.repository.mongoRepository.*.*Repository"))
public class PersistenceConfiguration {
@Autowired
private DataSource dataSource;
@Autowired
private Properties entityManagerProperties;
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource);
em.setPackagesToScan("com.google.product.model");
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
em.setJpaProperties(entityManagerProperties);
return em;
}
}
Class 数字 2:ProdDatabaseConfiguration 这是 class 声明 beans releted 到 JDBC & JPA。例如 primaryJdbcTemplate ,secondaryJdbcTemplate 和 entityManagerProperties。
@Configuration
@PropertySource({"classpath:database-prod.properties"})
@Profile("prod")
public class ProdDatabaseConfiguration {
private static final Logger LOG = LoggerFactory.getLogger(ProdDatabaseConfiguration.class);
@Value("${jdbc.jndiName}")
private String jndiName;
@Value("${hibernate.dialect}")
private String hibernateDialect;
@Value("${hibernate.show_sql}")
private String hibernateShowSql;
@Value("${hibernate.cache.use_second_level_cache}")
private String hibernateSecondLevelCache;
@Value("${hibernate.cache.use_query_cache}")
private String hibernateQueryCache;
@Value("${jadira.usertype.databaseZone}")
private String databaseZone;
@Value("${jadira.usertype.javaZone}")
private String javaZone;
@Value("${mongo.jndiName}")
private String mongoJndiName;
@Bean
public DataSource dataSource() {
JndiDataSourceLookup jndiDataSourceLookup = new JndiDataSourceLookup();
return jndiDataSourceLookup.getDataSource(jndiName);
}
@Bean(name = "entityManagerProperties")
public Properties additionalProperties() {
final Properties hibernateProperties = new Properties();
hibernateProperties.setProperty("hibernate.hbm2ddl.auto", "none");
hibernateProperties.setProperty("hibernate.dialect", hibernateDialect);
hibernateProperties.setProperty("hibernate.show_sql", hibernateShowSql);
hibernateProperties.setProperty("hibernate.cache.use_second_level_cache", hibernateSecondLevelCache);
hibernateProperties.setProperty("hibernate.cache.use_query_cache", hibernateQueryCache);
hibernateProperties.setProperty("jadira.usertype.databaseZone", databaseZone);
hibernateProperties.setProperty("jadira.usertype.javaZone", javaZone);
return hibernateProperties;
}
@Bean(name = "primaryJdbcTemplate")
public JdbcTemplate primaryJdbcTemplate() {
JndiDataSourceLookup jndiDataSourceLookup = new JndiDataSourceLookup();
return new JdbcTemplate(jndiDataSourceLookup.getDataSource(jndiName));
}
@Bean(name = "secondaryJdbcTemplate")
public NamedParameterJdbcTemplate secondaryJdbcTemplate() {
JndiDataSourceLookup jndiDataSourceLookup = new JndiDataSourceLookup();
return new NamedParameterJdbcTemplate(jndiDataSourceLookup.getDataSource(jndiName));
}
因为您只使用一个数据源,所以您可以删除所有配置并只使用 spring.datasource 属性。
事务也将开箱即用,因为您将只有此数据源。
在官方文档中阅读有关此主题的更多信息:
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-sql