1. Обзор
Эта статья будет посвящена настройке Hibernate 3 с помощью Spring — мы рассмотрим, как настроить Spring 3 с Hibernate 3 с использованием конфигурации Java и XML.
2. Maven
Чтобы добавить зависимости Spring Persistence в pom, см. Статью Spring with Maven .
Продолжая Hibernate 3, зависимости Maven просты:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>3.6.10.Final</version> </dependency>
Затем, чтобы Hibernate использовал свою модель прокси, нам также нужен javassist:
<dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.17.1-GA</version> </dependency>
И так как мы собираемся использовать MySQL для этого урока, нам также понадобится:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.25</version> <scope>runtime</scope> </dependency>
3. Конфигурация Java Spring для Hibernate 3
Настроить Hibernate 3 с помощью Spring и Java очень просто:
import java.util.Properties; import javax.sql.DataSource; 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.jdbc.datasource.DriverManagerDataSource; 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() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); 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 безопасна по типу — указание непосредственно на фабрику компонентов больше не является опцией — нам нужно извлечь компонент из фабрики компонентов вручную:
txManager.setSessionFactory(sessionFactory().getObject());
4. Конфигурация XML Spring для Hibernate 3
Simillary, Hibernate 3 также можно настроить с помощью XML Configuration:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"> <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.springframework.jdbc.datasource.DriverManagerDataSource"> <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 @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
5. Spring, Hibernate и MySQL
В приведенном выше примере MySQL 5 используется в качестве базовой базы данных, настроенной с помощью Hibernate, однако Hibernate поддерживает несколько базовых баз данных SQL .
5.1. Водитель
Имя класса драйвера настраивается с помощью в jdbc.driverClassName собственности , предоставленной DataSource.
В приведенном выше примере для него установлено значение com.mysql.jdbc.Driver из зависимости mysql-connector-java, которую мы определили в pom в начале статьи.
5.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 для каждой поддерживаемой базы данных.
6. Использование
На этом этапе Hibernate 3 полностью сконфигурирован с помощью Spring, и мы можем внедрить необработанный Hibernate SessionFactory напрямую, когда нам нужно:
public abstract class FooHibernateDAO{ @Autowired SessionFactory sessionFactory; ... protected Session getCurrentSession(){ return sessionFactory.getCurrentSession(); } }
7. Заключение
В этом примере мы сконфигурировали Hiberate 3 с Spring — как с конфигурацией Java, так и с XML. Реализацию этого простого проекта можно найти в проекте github — это проект на основе Eclipse, поэтому его легко импортировать и запускать как есть.