Спящий 3 с весны
1. обзор
В этой статье основное внимание будет уделено настройкеHibernate 3 with Spring - мы рассмотрим, как использовать конфигурацию XML и Java для настройки Spring с Hibernate 3 и MySQL.
Обновление: эта статья посвящена Hibernate 3. Если вы ищете текущую версию Hibernate -this is the article focused on it.
2. Java Конфигурация Spring для Hibernate 3
Настроить Hibernate 3 с помощью Spring и Java достаточно просто:
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.example.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.example.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 нет разницы междуpointing to a bean or pointing to a bean factory capable of creating that bean. Поскольку конфигурация Java безопасна по типу - указание непосредственно на фабрику bean больше не является опцией - нам нужно извлечь bean из фабрики bean вручную:
txManager.setSessionFactory(sessionFactory().getObject());
3. Конфигурация XML Spring для Hibernate 3
Точно так же мы можем настроитьHibernate 3 with XML config:
${hibernate.hbm2ddl.auto}
${hibernate.dialect}
Затем этот 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 Databases.
4.1. Водитель
Имя класса драйвера настраивается с помощьюthe jdbc.driverClassName property, предоставленного источнику данных.
В приведенном выше примере он установлен наcom.mysql.jdbc.Driver из зависимостиmysql-connector-java, которую мы определили в pom, в начале статьи.
4.2. Диалект
Диалект настраивается черезthe hibernate.dialect property, предоставленный для HibernateSessionFactory.
В приведенном выше примере это установлено наorg.hibernate.dialect.MySQL5Dialect, поскольку мы используем MySQL 5 в качестве базовой базы данных. other dialects supporting 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
Hibernatesupports SQL Dialects для каждой поддерживаемой базы данных.
5. использование
На данный момент Hibernate 3 полностью настроен с помощью Spring, и мы можемinject the raw HibernateSessionFactory напрямую, когда нам нужно:
public abstract class FooHibernateDAO{
@Autowired
SessionFactory sessionFactory;
...
protected Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
}
6. специалист
Чтобы добавить в pom зависимости Spring Persistence, см.Spring with Maven example - нам нужно будет определить какspring-context, так иspring-orm.
Продолжая Hibernate 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 Connection Pool:
org.apache.tomcat
tomcat-dbcp
7.0.55
7. Заключение
В этом примереwe configured Hibernate 3 with Spring - как с конфигурацией Java, так и с XML. Реализацию этого простого проекта можно найти вthe GitHub project - это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.