2017-10-16 4 views
0

私はスプリングブートを使用しており、デフォルトの隔離レベルをREAD_UNCOMMITTEDに変更したいとします。隔離レベルを変更する - hibernate.connection.isolationが機能しない

プロパティを検索したところ、hibernate.connection.isolationが見つかりましたが、試してみましたが、動作しませんでした。

私の構成はこれです:

private Properties additionalJpaProperties() { 
     Properties properties = new Properties(); 

     properties.setProperty("hibernate.hbm2ddl.auto", "validate"); 
     properties.setProperty("hibernate.dialect", "org.hibernate.dialect.SQLServerDialect"); 
     properties.setProperty("hibernate.connection.isolation", String.valueOf(Connection.TRANSACTION_READ_UNCOMMITTED)); 

     return properties; 
    } 

    @Primary 
    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) throws SQLException { 

     LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
     em.setDataSource(dataSource); 
     em.setPackagesToScan(this.packages); 
     JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
     em.setJpaVendorAdapter(vendorAdapter); 
     em.setJpaProperties(this.additionalJpaProperties()); 
     return em; 
    } 

は、どのように私は春のブートを使用して分離レベルを変更できますか?

答えて

0

誰にでも解決策が必要な場合。私が見つけた唯一の解決策は次のとおりです。

HibernateJpaDialectクラスを拡張して、beginTransactionメソッドを実装してトランザクション分離を設定します。それは次のようになります。

@Service 
public class CustomHibernateJpaDialect extends HibernateJpaDialect { 

    @Override 
    public Object beginTransaction(final EntityManager entityManager, 
      final TransactionDefinition definition) throws PersistenceException, 
      SQLException, TransactionException { 

     Session session = getSession(entityManager); 

     if (definition.getTimeout() != TransactionDefinition.TIMEOUT_DEFAULT) { 
      session.getTransaction().setTimeout(definition.getTimeout()); 
     } 

     entityManager.getTransaction().begin(); 

     session.doWork(new Work() { 
      public void execute(Connection connection) throws SQLException { 
       DataSourceUtils.prepareConnectionForTransaction(connection, definition); 
       connection.setTransactionIsolation(TransactionDefinition.ISOLATION_READ_UNCOMMITTED); 
      } 
     }); 

     return prepareTransaction(entityManager, definition.isReadOnly(), definition.getName()); 
    } 

} 

とのEntityManagerFactoryの設定で作成された方言を設定する必要がある:

@Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
      DataSource dataSource, 
      CustomHibernateJpaDialect customHibernateJpaDialect) throws SQLException { 

     LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
     em.setDataSource(dataSource); 

     JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 

     em.setJpaVendorAdapter(vendorAdapter); 
     em.setJpaDialect(customHibernateJpaDialect); 

     return em; 
    } 
関連する問題