春の休止状態3

1概要

この記事では、 Hibernate 3とSpring のセットアップに焦点を当てます。Hibernate3とMySQLでSpringをセットアップするためにXMLとJavaの両方の構成を使用する方法について説明します。

2 Java Hibernate 3用の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.baeldung.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.baeldung.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構成と比較すると、構成内のあるBeanが別のBeanにアクセスする方法に小さな違いがあります。 XMLでは、 Beanを指すことと、そのBeanを作成できるBeanファクトリーを指すこと の間に違いはありません。 Java設定は型保証されているので - Beanファクトリを直接指すことはもはや選択肢ではありません - BeanファクトリからBeanを手動で取得する必要があります。

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

3 Hibernate 3 用のXML Spring構成

同様に、 Hibernate 3をXML設定 で設定することもできます。

<context:property-placeholder location="classpath:persistence-mysql.properties"/>

<bean id="sessionFactory"
  class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="packagesToScan" value="org.baeldung.spring.persistence.model"/>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
        </props>
    </property>
</bean>

<bean id="dataSource"
  class="org.apache.tomcat.dbcp.dbcp.BasicDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.user}"/>
    <property name="password" value="${jdbc.pass}"/>
</bean>

<bean id="txManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

<bean id="persistenceExceptionTranslationPostProcessor"
  class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

次に、この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

上記の例ではMySQL 5をHibernateで設定された基本データベースとして使用しています - ただし、Hibernateは基本的なhttps://community.jboss.org/wiki/SupportedDatabases2[SQL Databases]をサポートしています。

4.1. ドライバ

Driverクラス名は、DataSourceに提供される jdbc.driverClassName プロパティ を介して設定されます。

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

4.2. 方言

方言はHibernate SessionFactory に提供された hibernate.dialect プロパティ を通して設定されます。

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

  • org.hibernate.dialect.MySQL5InnoDBDialect - MySQL 5.xの場合、

InnoDBストレージエンジン org.hibernate.dialect.MySQLDialect ** - 5.xより前のMySQLの場合

  • org.hibernate.dialect.MySQLInnoDBDialect - 5.xより前のMySQLの場合

InnoDBストレージエンジンとの連携 org.hibernate.dialect.MySQLMyISAMDialect ** - すべてのMySQLバージョン

ISAMストレージエンジンで

サポートされるすべてのデータベースについて、Hibernate support SQL Dialect

5使用法

この時点で、Hibernate 3はSpringで完全に設定されているので、次のような場合はいつでも 生のHibernate SessionFactory を直接インジェクトでき​​ます。

public abstract class FooHibernateDAO{

   @Autowired
   SessionFactory sessionFactory;

   ...

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

6. Maven

Spring永続性の依存関係をpomに追加するには、次のリンクを参照してください。/spring-with-maven#persistence[Spring with Mavenの例] - spring-context spring-orm の両方を定義する必要があります。

Hibernate 3を続けると、Mavenの依存関係は簡単です。

<dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-core</artifactId>
   <version>3.6.10.Final</version>
</dependency>

それから、Hibernateがそのプロキシモデルを使うことができるようにするためには、 javassist も必要です。

<dependency>
   <groupId>org.javassist</groupId>
   <artifactId>javassist</artifactId>
   <version>3.18.2-GA</version>
</dependency>

このチュートリアルのDBとしてMySQLを使用するので、次のものも必要になります。

<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>5.1.32</version>
   <scope>runtime</scope>
</dependency>

そして最後に、Springデータソースの実装である DriverManagerDataSource を使用しません。代わりに、プロダクション対応のコネクションプールソリューション - Tomcat JDBC Connection Poolを使用します。

<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-dbcp</artifactId>
    <version>7.0.55</version>
</dependency>

7. 結論

この例では、 Hibernate 3をSpring で構成しました - JavaとXMLの両方の構成で。この単純なプロジェクトの実装はhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-hibernate-3[the GitHub project]にあります - これはMavenベースのプロジェクトなので、インポートしてそのまま実行するのは簡単なはずです。