Hibernate 3 с весны

Спящий 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, поэтому его должно быть легко импортировать и запускать как есть.