Автор оригинала: Eugen Paraschiv.
1. Обзор
Эта статья будет посвящена настройке Hibernate 3 с Spring – мы рассмотрим, как использовать конфигурацию XML и Java для настройки Spring с Hibernate 3 и MySQL.
Обновление: эта статья посвящена Hibernate 3. Если вы ищете текущую версию Hibernate – это статья, посвященная ей .
2. Конфигурация Java Spring для гибернации 3
Настройка Hibernate 3 с помощью Spring и Java config проста:
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 нет никакой разницы между , указывающим на боб, или указывающим на фабрику бобов, способную создать этот боб . Поскольку конфигурация Java типобезопасна-указание непосредственно на фабрику бобов больше не является опцией – нам нужно вручную извлечь боб из фабрики бобов:
txManager.setSessionFactory(sessionFactory().getObject());
3. Конфигурация XML Spring для Hibernate 3
Аналогично, мы также можем настроить Hibernate 3 с помощью XML config :
Затем этот 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. Водитель
Имя класса драйвера настраивается с помощью свойства jdbc.driverClassName , предоставленного источнику данных.
В приведенном выше примере он установлен в com.mysql.jdbc.Driver из зависимости mysql-connector-java , которую мы определили в pom в начале статьи.
4.2. Диалект
Диалект настраивается с помощью свойства hibernate.dialect , предоставленного Hibernate SessionFactory .
В приведенном выше примере это значение равно org.hibernate.dialect.MySQL5Dialect поскольку мы используем MySQL 5 в качестве базовой базы данных. Существует несколько других диалектов, поддерживающих MySQL :
- орг.спящий режим.диалект.MySQL5InnoDBDialect – для MySQL 5.x с механизмом хранения InnoDB
- орг.спящий режим.диалект.MySQLDialect – для MySQL до 5.x
- орг.спящий режим.диалект.MySQLInnoDBDialect – для MySQL до 5.x с механизмом хранения InnoDB
- орг.спящий режим.диалект.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. Maven
Чтобы добавить зависимости персистентности Spring в pom, см. Пример Spring with Maven – нам нужно будет определить как spring-контекст , так и spring-orm .
Продолжая переходить в спящий режим 3, зависимости Maven просты:
org.hibernate hibernate-core 3.6.10.Final
Затем, чтобы включить Hibernate для использования своей прокси-модели, нам также нужен javassist :
org.javassist javassist 3.18.2-GA
Мы собираемся использовать MySQL в качестве нашей базы данных для этого урока, поэтому нам также понадобится:
mysql mysql-connector-java 5.1.32 runtime
И, наконец, мы не будем использовать реализацию источника данных Spring – DriverManagerDataSource ; вместо этого мы будем использовать готовое к производству решение пула соединений – пул соединений Tomcat JDBC:
org.apache.tomcat tomcat-dbcp 7.0.55
7. Заключение
В этом примере мы настроили Hibernate 3 с помощью Spring – как с конфигурацией Java, так и с конфигурацией XML. Реализацию этого простого проекта можно найти в проекте GitHub – это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.