Springboot Jpa save操作が無効な問題


Springboot Jpa save操作が無効です
1.まずjpa基本構成を貼り付ける
@SpringBootApplication
@EnableTransactionManagement
public class SpringbootApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplication .class, args);
    }
}
@Configuration
public class JpaConfig{
    @Autowired
    private DynamicDataSource dynamicDataSource;
    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setPackagesToScan("com.xxx.xxx.entity");
        factory.setJpaProperties(hibernateProperties());
        factory.setDataSource(dynamicDataSource);
        return factory;
    }

    @Bean("tx")//    bean           tx ,                
    public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory);
        return txManager;
    }

    private Properties hibernateProperties() {
        Properties properties = new Properties();
        //   sql  
        properties.put("hibernate.show_sql", true);
        //    sql  
        properties.put("hibernate.format_sql", true);
        //   
        properties.put("hibernate.dialect", "org.hibernate.dialect.MySQL5InnoDBDialect");
        //      
        properties.put("hibernate.hbm2ddl.auto", "update");
        //        
//        properties.put("hibernate.connection.autocommit",false);
//        properties.put("org.hibernate.flushMode", "COMMIT");
//        properties.put("hibernate.enable_lazy_load_no_trans",true);
        return properties;
    }

}

2.サービスコール
        @Transactional(value = "tx") //              
         public SysPrivilege createPrivilegeIfNotFound(String name) {

            SysPrivilege privilege = privilegeRepository.findPrivilegeByName(name);
            if (privilege == null) {
                privilege = new SysPrivilege();
                privilege.setName(name);
                privilege = privilegeRepository.save(privilege);
            }
            return privilege;
        }

最終結果:insert文が印刷されました
Hibernate: 
    insert 
    into
        sys_privilege
        (name) 
    values
        (?)
Hibernate: 
    select
        sysprivile0_.id as id1_0_,
        sysprivile0_.icon as icon2_0_,
        sysprivile0_.name as name3_0_,
        sysprivile0_.`
    order` as order4_0_,
    sysprivile0_.parentId as parentId5_0_,
    sysprivile0_.parentName as parentNa6_0_,
    sysprivile0_.perms as perms7_0_,
    sysprivile0_.type as type8_0_,
    sysprivile0_.url as url9_0_ from
        sys_privilege sysprivile0_ 
    where
        sysprivile0_.name=?

3、デフォルトのトランザクションマネージャを使用する場合は、クラスに@Componentを付けるクラスを書くこともできます.
PlatformTransactionManagerに戻る方法が1つしかないTransactionManagementConfigurerインタフェースを実装します.ここで返されるPlatformTransactionManagerは、デフォルトのトランザクション・プロセッサであることを示します.これにより、Transactional注釈でどのトランザクション・マネージャを使用するかを宣言する必要はありません.参照リンク:http://www.importnew.com/24138.html