当前位置: 首页 > 知识库问答 >
问题:

针对JPA和spring-JDBC-templete的@transactional的Spring Boot配置

公良育
2023-03-14
            @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这是一个声明jdbc&jpa关系到的bean的类。例如,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));
        }

共有1个答案

章茂
2023-03-14

因为您只使用一个datasource,所以可以删除所有配置,只使用Spring.datasource属性。

事务也将开箱即用,因为您将只有此数据源。

在官方文档中阅读有关此主题的更多信息:

 类似资料:
  • 这是一个简单的ORM工具,基于Spring jdbcTemplete,可以方便的根据对象生成相应的CRUD SQL语句。结合springboot使用可以大量的减少代码量。 # maven引入<dependency>  <groupId>com.github.shicloud</groupId>  <artifactId>simple-jdbc-templete</artifactId>  <ver

  • 问题内容: 以下是我的申请流程 控制器-服务-存储库 在服务层,我们具有注释。我们还具有配置,在其中指定实体管理器和txn管理器。 我的怀疑是我认为考虑了在其中指定的txn管理器,并且在服务层进行指定没有影响。例如:服务层可以映射到自定义的txn管理器,其中服务调用的存储库可能具有不同的txn管理器。在那种情况下会不会造成问题? 有人可以澄清一下,在使用jpa存储库时是否需要将其放置在服务层上?

  • 主要内容:1.@Transactional 失败的情况,2.@Transactional 源码分析,3.@Transactional 失效原因1.@Transactional 失败的情况 UserDao UserController @Transactional 事务不生效的几种情况 类内部访问:A 类的 a1 方法没有标注 @Transactional,a2 方法标注 @Transactional,在 a1 里面调用 a2; 私有方法:将 @Transactional 注解标注在非 publi

  • 我有一个与交易中的交易有关的疑问。作为背景,我有一个School实体对象,它有一组映射到它的Students实体对象。我使用的是Spring Data JPA,它负责所有的crud操作。我有一个SchoolManagementService类,它在类级别设置了@transactional(readonly=true),对于所有更新方法,我都在它们上面使用@transactional。在我的Scho

  • 问题内容: 我正在阅读使用Spring框架进行的事务管理。在第一个组合中,我使用了Spring + hiberante,并使用了Hibernate的API来控制事务(Hibenate API)。接下来,我想使用注释进行测试,它确实起作用。 我对此感到困惑: JPA,JTA,Hibernate是否具有它们自己的事务管理方式。例如,考虑如果我使用Spring + Hibernate,在那种情况下您会使

  • 我有一个非常基本的Spring Boot/JPA stack应用程序,它有一个控制器、服务层和存储库,它不像我所理解的那样持久更新。 微不足道的实体: 一个微不足道的存储库: 一个简单的服务层: 和一个REST控制器,它全部使用: 我启用了SQL调试日志,并查看了selects、update等。 使用上面的代码:当服务方法被控制器调用时,修改的实体不持久化。SQL日志显示实体的,但没有。 如果没有