Руководство по Hibernate 4 с Spring

Путеводитель по Hibernate 4 с весны

1. обзор

В этой статье основное внимание будет уделено настройкеHibernate 4 with Spring - мы рассмотрим, как настроить Spring с Hibernate 4 с использованием конфигурации Java и XML. Части этого процесса, конечно, общие дляthe Hibernate 3 article.

2. специалист

Чтобы добавить зависимости Spring Persistence к проектуpom.xml, см.article focused on the Spring and Maven dependencies.

Продолжая Hibernate 4, зависимости Maven просты:


   org.hibernate
   hibernate-core
   4.3.6.Final

Затем, чтобы Hibernate использовал свою модель прокси, нам также нужен javassist:


   org.javassist
   javassist
   3.18.2-GA

И поскольку мы собираемся использовать MySQL для этого руководства, нам также понадобятся:


   mysql
   mysql-connector-java
   5.1.32
   runtime

И, наконец, мы используем правильныйconnection pool вместо реализации Spring только для разработчиков -DriverManagerDataSource. Мы используем здесьTomcat JDBC Connection Pool:


    org.apache.tomcat
    tomcat-dbcp
    7.0.55

3. Java Конфигурация Spring для Hibernate 4

Чтобы использоватьHibernate 4 in a project, несколько вещей изменились на стороне конфигурации при переходе от настройки Hibernate 3.

Основной аспект, который отличается при обновлении с Hibernate 3, - это способ созданияSessionFactory with Hibernate 4.

Теперь это делается с помощьюLocalSessionFactoryBean из пакетаhibernate4, который заменяет старыйAnnotationSessionFactoryBean из пакетаhibernate3. НовыйFactoryBean несет такую ​​же ответственность - он загружаетSessionFactory из сканирования аннотаций. Это необходимо, потому что, начиная с Hibernate 3.6, старыйAnnotationConfigurationwas merged превращается вConfiguration, и поэтому новый Hibernate 4LocalSessionFactoryBean использует этот новый механизмConfiguration.

Также стоит отметить, что в Hibernate 4 методConfiguration.buildSessionFactory и механизмhave also been deprecatedin favor изConfiguration.buildSessionFactory(ServiceRegistry), который SpringLocalSessionFactoryBean еще не использует.

Конфигурация Spring Java для Hibernate 4:

@Configuration
@EnableTransactionManagement
@PropertySource({ "classpath:persistence-mysql.properties" })
@ComponentScan({ "org.example.spring.persistence" })
public class PersistenceConfig {

   @Autowired
   private Environment env;

   @Bean
   public LocalSessionFactoryBean sessionFactory() {
      LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
      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"));
            setProperty("hibernate.globally_quoted_identifiers",
             "true");
         }
      };
   }
}

4. Конфигурация XML Spring для Hibernate 4

Аналогично,Hibernate 4 can be configured with XML:




    
    
    
        
            ${hibernate.hbm2ddl.auto}
            ${hibernate.dialect}
        
    



    
    
    
    



    


Чтобы загрузить XML в контекст Spring, мы можем использовать простой файл конфигурации Java, если приложение настроено с конфигурацией Java:

@Configuration
@EnableTransactionManagement
@ImportResource({ "classpath:hibernate4Config.xml" })
public class HibernateXmlConfig{
   //
}

В качестве альтернативы, мы можем просто предоставить XML-файл в контекст Spring, если общая конфигурация является чисто XML.

Для обоих типов конфигурации специфические свойства 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

Драйверы и диалекты, поддерживаемые Hibernatehave been extensively discussed для Hibernate 3 - и все по-прежнему применимо и для Hibernate 4.

6. использование

На данный момент Hibernate 4 полностью настроен с помощью Spring, и мы можемinject the raw Hibernate SessionFactory напрямую, когда нам нужно:

public abstract class BarHibernateDAO{

   @Autowired
   SessionFactory sessionFactory;

   ...

   protected Session getCurrentSession(){
      return sessionFactory.getCurrentSession();
   }
}

Здесь важно отметить, что теперь это рекомендуемый способ использования Hibernate API - старыйHibernateTemplate больше не включен в новый пакетorg.springframework.orm.hibernate4, так как он не должен использоваться с Hibernate 4.

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

В этом примереwe configured Spring with Hibernate 4 - как с конфигурацией Java, так и с XML.

Как всегда, доступен код, представленный в этой статьеover on Github. Это проект, основанный на Maven, поэтому его легко импортировать и запускать как есть.