Хибернация 3 с пролет

1. Общ преглед

Тази статия ще се фокусира върху настройването на Hibernate 3 с Spring - ще разгледаме как да използваме XML и Java конфигурация, за да настроим Spring с Hibernate 3 и MySQL.

Актуализация: тази статия е фокусирана върху Hibernate 3. Ако търсите текущата версия на Hibernate - това е статията, фокусирана върху нея.

2. Java Spring Configuration за Hibernate 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 конфигурация :

      ${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.

4.1. Шофьорът

Името на класа Пилотът се конфигурира чрез по jdbc.driverClassName собственост , предоставена на източника на данни.

В горния пример е зададен на com.mysql.jdbc.Driver от зависимостта mysql-connector-java, която определихме в pom, в началото на статията.

4.2. Диалектът

Говорът е конфигуриран чрез по hibernate.dialect собственост , предоставена на хибернация 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 Dialects за всяка поддържана база данни.

5. Употреба

На този етап Hibernate 3 е напълно конфигуриран с Spring и ние можем да инжектираме суровия Hibernate SessionFactory директно, когато трябва:

public abstract class FooHibernateDAO{ @Autowired SessionFactory sessionFactory; ... protected Session getCurrentSession(){ return sessionFactory.getCurrentSession(); } }

6. Мейвън

За да добавите зависимостите Spring Persistence към pom, моля, вижте примера Spring with Maven - ще трябва да дефинираме 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 data source - DriverManagerDataSource ; вместо това ще използваме готово за производство решение за пул за свързване - Tomcat JDBC Connection Pool:

 org.apache.tomcat tomcat-dbcp 7.0.55 

7. Заключение

В този пример конфигурирахме Hibernate 3 с Spring - както с Java, така и с XML конфигурация. Изпълнението на този прост проект може да се намери в проекта GitHub - това е проект, базиран на Maven, така че трябва да е лесно да се импортира и да се изпълнява както е.