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, поэтому его легко импортировать и запускать как есть.