2017-07-13 10 views
0

古いプロジェクトを新しいプラットフォームに移行する必要があります。既にスプリングブートプロジェクトに移行されている他のプロジェクトがありました。しかし、今は私の組織にいない若干の才能あるメンバーによって行われました。Springデータjpaまたはcustome daoの実装

最新のSpring-data-jpa/Hibernate(私はboot + dataでうまくいきます)よりデータアクセス層に次のコードを使用することの利点と欠点を知りたいと思います。

私の個人的なご理解から、それは新しい休止状態のセッションとのその行進を呼び出すと、そのセッションは、そのDAOによって行われた仕事がすぐにコミットされます。ユーザセッション要求が2つのDAOクラスを利用する場合、トランザクション管理がこの場合どのように起こっているか。私はこのコードがこの新しい設定でコンテキストを上回っていることを知っています。あなたの例と間違って何もない、この質問から

究極の期待は、このコードや春のデータを追跡するため、天候のですか?と利点は、事前に

 package com.xxxx 

    import com.fasterxml.jackson.annotation.JsonInclude; 
    import com.fasterxml.jackson.databind.ObjectMapper; 
    import com.fasterxml.jackson.databind.SerializationFeature; 
    import io.searchbox.client.JestClientFactory; 
    import org.apache.commons.dbcp2.BasicDataSource; 
    import org.elasticsearch.client.RestClient; 
    import org.elasticsearch.search.builder.SearchSourceBuilder; 
    import org.hibernate.SessionFactory; 
    import org.springframework.beans.factory.annotation.Autowired; 
    import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; 
    import org.springframework.context.annotation.Bean; 
    import org.springframework.context.annotation.ComponentScan; 
    import org.springframework.context.annotation.ComponentScan.Filter; 
    import org.springframework.context.annotation.Configuration; 
    import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; 
    import org.springframework.core.io.ClassPathResource; 
    import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; 
    import org.springframework.orm.hibernate4.HibernateTransactionManager; 
    import org.springframework.orm.hibernate4.LocalSessionFactoryBuilder; 
    import org.springframework.stereotype.Controller; 
    import org.springframework.transaction.annotation.EnableTransactionManagement; 

    import javax.sql.DataSource; 
    import java.util.Locale; 
    import java.util.Properties; 

    @Configuration 
    @SuppressWarnings("PMD.UseSingleton") 
    @ComponentScan(basePackageClasses = Application.class, 
      excludeFilters = @Filter({Controller.class, Configuration.class})) 
    @EnableTransactionManagement 
    public class ApplicationContextConfig { 

     @Autowired 
     private ConnectorConfiguration connectorConfiguration; 

     @Autowired 
     private WebNotifyConnectorConfiguration webNotifyConnectorConfiguration; 

     @Bean(name = "webNotifyDataSource") 
     public DataSource getWebNotifyDataSource() { 
      return getBasicDataSource(webNotifyConnectorConfiguration); 
     } 

     @Autowired 
     @Bean(name = "webNotifySessionFactory") 
     public SessionFactory getWebNotifySessionFactory(DataSource webNotifyDataSource) { 
      LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(webNotifyDataSource); 
      sessionBuilder.addProperties(getHibernateProperties()); 
      sessionBuilder.addAnnotatedClasses(PartnerNotify.class); 
      return sessionBuilder.buildSessionFactory(); 
     } 

     @Autowired 
     @Bean(name = "webNotifyTransactionManager") 
     public HibernateTransactionManager getWebNotifyTransactionManager(SessionFactory webNotifySessionFactory) { 
      return new HibernateTransactionManager(webNotifySessionFactory); 
     } 

     private BasicDataSource getBasicDataSource(IConnectorConfiguration connectorConfiguration) { 
      final BasicDataSource dataSource = new BasicDataSource(); 
      dataSource.setDriverClassName(connectorConfiguration.getDriverClassName()); 
      dataSource.setUrl(connectorConfiguration.getConnectionUrl()); 
      dataSource.setUsername(connectorConfiguration.getConnectionUsername()); 
      dataSource.setPassword(connectorConfiguration.getConnectionPassword()); 
      return dataSource; 
     } 

     private Properties getHibernateProperties() { 
      Properties properties = new Properties(); 
      properties.put("hibernate.show_sql", "true"); 
      properties.put("hibernate.dialect", "org.hibernate.dialect.OracleDialect"); 
      return properties; 
     } 

     @Autowired 
     @Bean(name = "partnerNotifyDao") 
     public PartnerNotifyDao getPartnerNotifyDao(SessionFactory webNotifySessionFactory) { 
      return new PartnerNotifyDaoImpl(webNotifySessionFactory); 
     } 
    } 

おかげで何...

答えて

1

Spring起動前にJava @Configurationか古いxmlベースの設定を使用するかどうかにかかわらず、すべてのBeanを手動で定義する必要がありました。

ユーザセッション要求が2つのDAOクラスを使用する場合、トランザクション の管理がこの場合に起こっているかどうか。

さて、トランザクションの構成方法によって異なります。より具体的には、@Transactionalアノテーションはどこにあり、どのように伝播がそれらのアノテーションに設定されていますか?

Spring Boot + Spring Data JPAを使用することの第1の利点は、これらのような構成を書く必要がないことです。代わりに@EnableAutoConfiguration、@EnableJpaRepositoriesだけで、いくつかの設定をapplication.ymlに入れて、あなたがBootでインスタンス化されたDataSouce、Hibernate SessionFactoryなどを取得します。

ApplicationContextConfig:

@Configuration 
@SuppressWarnings("PMD.UseSingleton") 
@ComponentScan(basePackageClasses = Application.class, 
     excludeFilters = @Filter({Controller.class, Configuration.class})) 
@EnableJpaRepositories(basePackageClasses = {PartnerNotifyDao.class}) 
@EntityScan(basePackageClasses = User.class) 
@EnableTransactionManagement 
public class ApplicationContextConfig { 

} 

application.yml:

spring: 
    datasource: 
    driver-class-name: <your driver> 
    url: <jdbc url> 
    username: <db username> 
    password: <db password> 
    jpa: 
    hibernate: 
     ddl-auto: validate 
    database: oracle 
    show-sql: true 

あなたのアプリケーションは、唯一のデータソース、私は春のブート構成を簡略化して使用することをお勧め1つのTXマネージャを使用して、単純な場合。

関連する問題