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-contextとspring-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ベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。