春のHibernate3
1. 概要
この記事では、SpringでHibernate 3をセットアップすることに焦点を当てます。XMLとJava構成の両方を使用して、Hibernate3とMySQLでSpringをセットアップする方法を見ていきます。
更新:この記事はHibernate3に焦点を当てています。 Hibernateの現在のバージョンを探している場合–これはそれに焦点を当てた記事です。
2. Java SpringHibernate3の構成
SpringとJavaの設定でHibernate3を設定するのは簡単です。
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({ "com.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[] { "com.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構成と比較すると、構成内の1つのBeanが別のBeanにアクセスする方法にわずかな違いがあります。 XMLでは、 Beanを指す場合と、そのBeanを作成できるBeanファクトリを指す場合の間に違いはありません。 Java構成はタイプセーフであるため(Beanファクトリを直接指すことはできなくなりました)、BeanファクトリからBeanを手動で取得する必要があります。
txManager.setSessionFactory(sessionFactory().getObject());
3. Hibernate3のXMLSpring構成
同様に、XMLconfigを使用してHibernate3をセットアップすることもできます。
<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="com.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
上記の例では、Hibernateで構成された基盤となるデータベースとしてMySQL 5を使用していますが、Hibernateはいくつかの基盤となるSQLデータベースをサポートしています。
4.1. ドライバ
ドライバークラス名は、データソースに提供される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 –InnoDBストレージエンジンを搭載したMySQL5.xの場合
- org.hibernate.dialect.MySQLDialect –5.xより前のMySQLの場合
- org.hibernate.dialect.MySQLInnoDBDialect –InnoDBストレージエンジンを搭載した5.xより前のMySQLの場合
- org.hibernate.dialect.MySQLMyISAMDialect –ISAMストレージエンジンを搭載したすべてのMySQLバージョン用
Hibernate は、サポートされているすべてのデータベースに対してSQLDialectsをサポートしています。
5. 使用法
この時点で、Hibernate 3はSpringで完全に構成されており、必要なときにいつでも生のHibernate SessionFactoryを直接注入できます。
public abstract class FooHibernateDAO{
@Autowired
SessionFactory sessionFactory;
...
protected Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
}
6. Maven
Spring永続性の依存関係をpomに追加するには、Springと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 dataソース実装– DriverManagerDataSource;を使用しません。 代わりに、本番環境に対応した接続プールソリューションであるTomcatJDBC接続プールを使用します。
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-dbcp</artifactId>
<version>7.0.55</version>
</dependency>
7. 結論
この例では、 Hibernate3をSpringで構成しました–JavaとXMLの両方の構成で。 この単純なプロジェクトの実装は、 GitHubプロジェクトにあります。これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。