Статьи

Спящий 3 с весны

1. Обзор

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

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

Настроить Hibernate 3 с помощью Spring и Java достаточно просто:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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
   public HibernateTransactionManager transactionManager() {
      HibernateTransactionManager txManager = new HibernateTransactionManager();
      txManager.setSessionFactory(sessionFactory().getObject());
 
      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 нет разницы между указанием на компонент или на фабрику компонентов, способную создать этот компонент . Поскольку конфигурация Java безопасна по типу — указание непосредственно на фабрику компонентов больше не является опцией — нам нужно извлечь компонент из фабрики компонентов вручную:

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

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

Точно так же мы можем настроить Hibernate 3 с помощью XML config :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?xml version="1.0" encoding="UTF-8"?>
   xsi:schemaLocation="
 
   <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"/>
 
</beans>

Затем этот XML-файл загружается в контекст Spring с помощью класса @Configuration :

1
2
3
4
5
6
@Configuration
@EnableTransactionManagement
@ImportResource({ "classpath:persistenceConfig.xml" })
public class PersistenceXmlConfig {
   //
}

Для обоих типов конфигурации специфические свойства JDBC и Hibernate хранятся в файле свойств:

1
2
3
4
5
6
7
8
9
# 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. Водитель

Имя класса драйвера настраивается через свойство 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 напрямую, когда нам нужно:

01
02
03
04
05
06
07
08
09
10
11
public abstract class FooHibernateDAO{
 
   @Autowired
   SessionFactory sessionFactory;
 
   ...
 
   protected Session getCurrentSession(){
      return sessionFactory.getCurrentSession();
   }
}

6. Maven

Чтобы добавить зависимости Spring Persistence в pom, см. Пример Spring with Maven — нам нужно определить и spring-context, и spring-orm .

Продолжая Hibernate 3, зависимости Maven просты:

1
2
3
4
5
<dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-core</artifactId>
   <version>3.6.10.Final</version>
</dependency>

Затем, чтобы Hibernate использовал свою модель прокси, нам также нужен javassist :

1
2
3
4
5
<dependency>
   <groupId>org.javassist</groupId>
   <artifactId>javassist</artifactId>
   <version>3.18.0-GA</version>
</dependency>

Мы собираемся использовать MySQL в качестве нашей БД для этого урока, поэтому нам также потребуется:

1
2
3
4
5
6
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>5.1.25</version>
   <scope>runtime</scope>
</dependency>

И, наконец, мы не будем использовать реализацию источника данных Spring — DriverManagerDataSource ; вместо этого мы будем использовать готовое к использованию решение для пула соединений — Tomcat JDBC Connection Pool:

1
2
3
4
5
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-dbcp</artifactId>
    <version>7.0.41</version>
</dependency>

7. Заключение

В этом примере мы сконфигурировали Hibernate 3 с Spring — как с конфигурацией Java, так и с XML. Реализацию этого простого проекта можно найти в проекте github — это проект на основе Eclipse, поэтому его легко импортировать и запускать как есть.

Ссылка: Hibernate 3 с Spring от нашего партнера JCG Евгения Параскива в блоге baeldung .