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.Xjdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/spring_hibernate_dev?createDatabaseIfNotExist=truejdbc.user=tutorialuserjdbc.pass=tutorialmy5ql# hibernate.Xhibernate.dialect=org.hibernate.dialect.MySQL5Dialecthibernate.show_sql=falsehibernate.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, поэтому его легко импортировать и запускать как есть.