Найти тему

Hibernate 3 с Spring

1. Обзор

В этой статье основное внимание будет уделено настройке Hibernate 3 с помощью Spring — мы рассмотрим, как использовать конфигурацию XML и Java для настройки Spring с Hibernate 3 и MySQL.

2. Конфигурация Java Spring для Hibernate 3

Настройка Hibernate 3 с конфигурацией Spring и Java проста:

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, описанной далее, есть небольшая разница в том, как один компонент в конфигурации получает доступ к другому. В XML нет разницы между указанием на bean-компонент или указанием на фабрику bean-компонентов, способную создать этот bean-компонент . Поскольку конфигурация Java является типобезопасной — прямое указание на фабрику компонентов больше не является опцией — нам нужно получить компонент из фабрики компонентов вручную:

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

3. Конфигурация XML Spring для Hibernate 3

Точно так же мы можем настроить 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="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-файл загружается в контекст Spring с помощью класса @Configuration :

@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 поддерживает несколько базовых баз данных SQL .

4.1. Driver

Имя класса Driver настраивается с помощью свойства jdbc.driverClassName , предоставленного источнику данных .

В приведенном выше примере для него установлено значение com.mysql.jdbc.Driver из зависимости mysql-connector-java , которую мы определили в pom в начале статьи.

4.2. Диалект

Диалект настраивается с помощью свойства hibernate.dialect , предоставляемого Hibernate SessionFactory .

В приведенном выше примере установлено значение org.hibernate.dialect.MySQL5Dialect , поскольку мы используем MySQL 5 в качестве базовой базы данных. Есть несколько других диалектов, поддерживающих MySQL :

  • org.hibernate.dialect.MySQL5InnoDBDialect — для MySQL 5.x с механизмом хранения InnoDB.
  • org.hibernate.dialect.MySQLDialect — для MySQL до 5.x
  • org.hibernate.dialect.MySQLInnoDBDialect — для MySQL до 5.x с механизмом хранения InnoDB.
  • org.hibernate.dialect.MySQLMyISAMDialect — для всех версий MySQL с механизмом хранения ISAM.

Hibernate поддерживает диалекты SQL для каждой поддерживаемой базы данных.

5. Использование

На данный момент Hibernate 3 полностью настроен с помощью Spring, и мы можем вводить необработанную Hibernate SessionFactory напрямую, когда нам нужно:

public abstract class FooHibernateDAO{
@Autowired
SessionFactory sessionFactory;
...
protected Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
}

6. Мавен

Чтобы добавить зависимости Spring Persistence к 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>

Мы собираемся использовать 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. Реализацию этого простого проекта можно найти в проекте GitHub — это проект на основе Maven, поэтому его легко импортировать и запускать как есть.