春の休止状態3

Hibernate 3とSpring

1. 概要

この記事では、Hibernate 3 with Springの設定に焦点を当てます。XMLとJavaの両方の構成を使用して、Hibernate3とMySQLでSpringを設定する方法を見ていきます。

更新:この記事はHibernate 3に焦点を当てています。 Hibernateの現在のバージョンを探している場合–this is the article focused on it

2. Java Hibernate3のSpring構成

SpringおよびJavaの設定でHibernate 3をセットアップするのは簡単です:

import java.util.Properties;
import javax.sql.DataSource;
import org.apache.tomcat.dbcp.dbcp.BasicDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
import org.springframework.orm.hibernate3.HibernateTransactionManager;
import org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import com.google.common.base.Preconditions;

@Configuration
@EnableTransactionManagement
@PropertySource({ "classpath:persistence-mysql.properties" })
@ComponentScan({ "org.example.spring.persistence" })
public class PersistenceConfig {

   @Autowired
   private Environment env;

   @Bean
   public AnnotationSessionFactoryBean sessionFactory() {
      AnnotationSessionFactoryBean sessionFactory = new AnnotationSessionFactoryBean();
      sessionFactory.setDataSource(restDataSource());
      sessionFactory.setPackagesToScan(new String[] { "org.example.spring.persistence.model" });
      sessionFactory.setHibernateProperties(hibernateProperties());

      return sessionFactory;
   }

   @Bean
   public DataSource restDataSource() {
      BasicDataSource dataSource = new BasicDataSource();
      dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
      dataSource.setUrl(env.getProperty("jdbc.url"));
      dataSource.setUsername(env.getProperty("jdbc.user"));
      dataSource.setPassword(env.getProperty("jdbc.pass"));

      return dataSource;
   }

   @Bean
   @Autowired
   public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
      HibernateTransactionManager txManager = new HibernateTransactionManager();
      txManager.setSessionFactory(sessionFactory);

      return txManager;
   }

   @Bean
   public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
      return new PersistenceExceptionTranslationPostProcessor();
   }

   Properties hibernateProperties() {
      return new Properties() {
         {
            setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
            setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
         }
      };
   }
}

次に説明するXML構成と比較すると、構成内の1つのBeanが別のBeanにアクセスする方法にわずかな違いがあります。 XMLでは、pointing to a bean or pointing to a bean factory capable of creating that beanの間に違いはありません。 Java構成はタイプセーフであるため(Beanファクトリを直接指すことはオプションではなくなったため)、BeanファクトリからBeanを手動で取得する必要があります。

txManager.setSessionFactory(sessionFactory().getObject());

3. Hibernate3のXMLSpring構成

同様に、Hibernate 3 with XML configも設定できます。




    
    
    
        
            ${hibernate.hbm2ddl.auto}
            ${hibernate.dialect}
        
    



    
    
    
    



    


次に、このXMLファイルは@Configurationクラスを使用してSpringコンテキストにブートストラップされます。

@Configuration
@EnableTransactionManagement
@ImportResource({ "classpath:persistenceConfig.xml" })
public class PersistenceXmlConfig {
   //
}

どちらのタイプの構成でも、JDBCおよびHibernate固有のプロパティはプロパティファイルに保存されます。

# jdbc.X
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring_hibernate_dev?createDatabaseIfNotExist=true
jdbc.user=tutorialuser
jdbc.pass=tutorialmy5ql
# hibernate.X
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.show_sql=false
hibernate.hbm2ddl.auto=create-drop

4. Spring、HibernateおよびMySQL

上記の例では、Hibernateで構成された基盤となるデータベースとしてMySQL 5を使用していますが、Hibernateはいくつかの基盤となるSQL Databasesをサポートしています。

4.1. ドライバ

ドライバークラス名は、データソースに提供されるthe jdbc.driverClassName propertyを介して構成されます。

上記の例では、記事の冒頭でpomで定義したmysql-connector-java依存関係からcom.mysql.jdbc.Driverに設定されています。

4.2. 方言

方言は、休止状態のSessionFactoryに提供されるthe hibernate.dialect propertyを介して構成されます。

上記の例では、基盤となるデータベースとしてMySQL 5を使用しているため、これはorg.hibernate.dialect.MySQL5Dialectに設定されています。 いくつかのother dialects supporting MySQLがあります:

  • org.hibernate.dialect.MySQL5InnoDBDialect –InnoDBストレージエンジンを搭載したMySQL5.xの場合

  • org.hibernate.dialect.MySQLDialect –5.xより前のMySQLの場合

  • org.hibernate.dialect.MySQLInnoDBDialect –InnoDBストレージエンジンを搭載した5.xより前のMySQLの場合

  • org.hibernate.dialect.MySQLMyISAMDialect –ISAMストレージエンジンを搭載したすべてのMySQLバージョン

サポートされているすべてのデータベースに対してsupports SQL Dialectsを休止状態にします。

5. 使用法

この時点で、Hibernate 3はSpringで完全に構成されており、必要なときにいつでも直接inject the raw HibernateSessionFactoryを実行できます。

public abstract class FooHibernateDAO{

   @Autowired
   SessionFactory sessionFactory;

   ...

   protected Session getCurrentSession(){
      return sessionFactory.getCurrentSession();
   }
}

6. メーベン

Spring Persistenceの依存関係をpomに追加するには、Spring with Maven exampleを参照してください。spring-contextspring-ormの両方を定義する必要があります。

Hibernate 3に続き、Mavenの依存関係は単純です:


   org.hibernate
   hibernate-core
   3.6.10.Final

次に、Hibernateがプロキシモデルを使用できるようにするには、javassistも必要です。


   org.javassist
   javassist
   3.18.2-GA

このチュートリアルのデータベースとしてMySQLを使用するため、次のものも必要になります。


   mysql
   mysql-connector-java
   5.1.32
   runtime

そして最後に、Springデータソースの実装(DriverManagerDataSource)は使用しません。代わりに、本番環境に対応した接続プールソリューションであるTomcatJDBC接続プールを使用します。


    org.apache.tomcat
    tomcat-dbcp
    7.0.55

7. 結論

この例では、we configured Hibernate 3 with Spring –JavaとXMLの両方の構成を使用しています。 この単純なプロジェクトの実装はthe GitHub projectにあります。これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。