1. Обзор
Эта статья будет посвящена настройке Hibernate 4 с помощью Spring — мы рассмотрим, как настроить Spring 3 с Hibernate 4 с использованием конфигурации Java и XML. Части этого процесса, конечно, являются общими для статьи Hibernate 3 .
2. Maven
Чтобы добавить зависимости Spring Persistence в проект pom.xml , см. Статью, посвященную зависимостям Spring и Maven .
Продолжая Hibernate 4, зависимости Maven просты:
1
2
3
4
5
|
< dependency > < groupId >org.hibernate</ groupId > < artifactId >hibernate-core</ artifactId > < version >4.2.4.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.26</ version > < scope >runtime</ scope > </ dependency > |
И наконец, мы используем правильный пул соединений вместо реализации Spring только для разработчика — DriverManagerDataSource . Мы используем здесь пул соединений Tomcat JDBC :
1
2
3
4
5
|
< dependency > < groupId >org.apache.tomcat</ groupId > < artifactId >tomcat-dbcp</ artifactId > < version >7.0.41</ version > </ dependency > |
3. Настройка Java Spring для Hibernate 4
Чтобы использовать Hibernate 4 в проекте , некоторые изменения были внесены в конфигурацию при переходе от установки Hibernate 3.
Основным аспектом, который отличается при обновлении от Hibernate 3, является способ создания SessionFactory с Hibernate 4 .
Теперь это делается с помощью LocalSessionFactoryBean из пакета hibernate4 , который заменяет более старый AnnotationSessionFactoryBean из пакета hibernate3 . Новый FactoryBean несет такую же ответственность — он загружает SessionFactory из сканирования аннотаций. Это необходимо, поскольку, начиная с Hibernate 3.6, старая AnnotationConfiguration была объединена с Configuration, и поэтому новый Hibernate 4 LocalSessionFactoryBean использует этот новый механизм конфигурации .
Также стоит отметить, что в Hibernate 4 метод и механизм Configuration.buildSessionFactory также устарели в пользу Configuration.buildSessionFactory (ServiceRegistry) — который Spring LocalSessionFactoryBean еще не использует.
Конфигурация Spring Java для Hibernate 4:
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
68
|
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.hibernate4.HibernateTransactionManager; import org.springframework.orm.hibernate4.LocalSessionFactoryBean; 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 LocalSessionFactoryBean sessionFactory() { LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 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" )); setProperty( "hibernate.globally_quoted_identifiers" , "true" ); } }; } } |
4. Конфигурация XML Spring для Hibernate 4
Simillary, Hibernate 4 также может быть настроен с XML :
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.hibernate4.LocalSessionFactoryBean" > < 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.hibernate4.HibernateTransactionManager" > < property name = "sessionFactory" ref = "sessionFactory" /> </ bean > < bean id = "persistenceExceptionTranslationPostProcessor" class = "org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" /> </ beans > |
Чтобы загрузить XML в контекст Spring, мы можем использовать простой файл конфигурации Java, если приложение настроено с конфигурацией Java:
1
2
3
4
5
6
|
@Configuration @EnableTransactionManagement @ImportResource ({ "classpath:hibernate4Config.xml" }) public class HibernateXmlConfig{ // } |
В качестве альтернативы мы можем просто предоставить XML-файл для Spring Context, если общая конфигурация является чисто XML.
Для обоих типов конфигурации специфические свойства JDBC и Hibernate хранятся в файле свойств:
01
02
03
04
05
06
07
08
09
10
|
# 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 |
5. Spring, Hibernate и MySQL
Драйверы и диалекты, поддерживаемые Hibernate , широко обсуждались для Hibernate 3 — и все еще применимо и к Hibernate 4.
6. Использование
На этом этапе Hibernate 4 полностью сконфигурирован с помощью Spring, и мы можем внедрить необработанный Hibernate SessionFactory напрямую, когда нам нужно:
01
02
03
04
05
06
07
08
09
10
11
|
public abstract class BarHibernateDAO{ @Autowired SessionFactory sessionFactory; ... protected Session getCurrentSession(){ return sessionFactory.getCurrentSession(); } } |
Важным примечанием здесь является то, что теперь это рекомендуемый способ использования Hibernate API — старый HibernateTemplate больше не включается в новый пакет org.springframework.orm.hibernate4 , так как его не следует использовать с Hibernate 4.
7. Заключение
В этом примере мы настроили Spring с Hiberate 4 — как с конфигурацией Java, так и с XML. Реализацию этого простого проекта можно найти в проекте github — это проект на основе Eclipse, поэтому его легко импортировать и запускать как есть.