Настройка начальной загрузки для @Transactional как для JPA, так и для Spring-JDBC-templete - PullRequest
0 голосов
/ 18 июня 2019

в моем проекте я использую как JPA, так и spring-jdbc-template & NamedParameterTemplate. Мне нужно получить поддержку транзакций для обоих.

Так как настроить @Transactional для JPA и spring-JDBC?

Вот 2 класса, которые я использовал для их настройки.

Класс № 1: постоянство конфигурации Это класс, который объявляет, что управление транзакциями должно быть включено.

            @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;
            }

        }

Класс № 2: ProdDatabaseConfiguration Это класс, который объявляет bean-компоненты, выпущенные в JDBC и JPA. например primaryJdbcTemplate, вторичнаяJdbcTemplate & 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));
        }

1 Ответ

2 голосов
/ 19 июня 2019

Поскольку вы используете только один источник данных, вы можете удалить всю конфигурацию и просто использовать свойства spring.datasource.

Транзакция также будет работать "из коробки", поскольку у вас будет только этот источник данных.

Подробнее об этой теме читайте в официальной документации:

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-sql

...