Iberna 3 con la primavera

1. Panoramica

Questo articolo si concentrerà sulla configurazione di Hibernate 3 con Spring : vedremo come utilizzare la configurazione XML e Java per configurare Spring con Hibernate 3 e MySQL.

Aggiornamento: questo articolo è incentrato su Hibernate 3. Se stai cercando la versione corrente di Hibernate, questo è l'articolo incentrato su di essa.

2. Configurazione Java Spring per Hibernate 3

La configurazione di Hibernate 3 con Spring e Java è semplice:

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")); } }; } }

Rispetto alla configurazione XML, descritta di seguito, c'è una piccola differenza nel modo in cui un bean nella configurazione accede a un altro. In XML non c'è differenza tra puntare a un bean o puntare a una bean factory in grado di creare quel bean . Poiché la configurazione Java è indipendente dai tipi - puntare direttamente al bean factory non è più un'opzione - è necessario recuperare manualmente il bean dalla bean factory:

txManager.setSessionFactory(sessionFactory().getObject());

3. Configurazione XML Spring per Hibernate 3

Allo stesso modo, possiamo impostare Hibernate 3 anche con la configurazione XML :

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

Quindi, questo file XML viene avviato nel contesto Spring utilizzando una classe @Configuration :

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

Per entrambi i tipi di configurazione, le proprietà specifiche di JDBC e Hibernate sono memorizzate in un file delle proprietà:

# 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 e MySQL

L'esempio precedente utilizza MySQL 5 come database sottostante configurato con Hibernate, tuttavia Hibernate supporta diversi database SQL sottostanti.

4.1. L'autista

Il nome della classe Driver viene configurato tramite la proprietà jdbc.driverClassName fornita a DataSource.

Nell'esempio sopra, è impostato su com.mysql.jdbc.Driver dalla dipendenza mysql-connector-java che abbiamo definito nel pom, all'inizio dell'articolo.

4.2. Il dialetto

Il dialetto viene configurato tramite la proprietà hibernate.dialect fornita a Hibernate SessionFactory .

Nell'esempio sopra, questo è impostato su org.hibernate.dialect.MySQL5Dialect poiché stiamo usando MySQL 5 come database sottostante. Esistono molti altri dialetti che supportano MySQL :

  • org.hibernate.dialect.MySQL5InnoDBDialect - per MySQL 5.x con il motore di archiviazione InnoDB
  • org.hibernate.dialect.MySQLDialect - per MySQL precedenti a 5.x
  • org.hibernate.dialect.MySQLInnoDBDialect - per MySQL precedente a 5.x con il motore di archiviazione InnoDB
  • org.hibernate.dialect.MySQLMyISAMDialect - per tutte le versioni di MySQL con il motore di archiviazione ISAM

Hibernate supporta i dialetti SQL per ogni database supportato.

5. Utilizzo

A questo punto, Hibernate 3 è completamente configurato con Spring e possiamo iniettare il grezzo Hibernate SessionFactory direttamente ogni volta che abbiamo bisogno di:

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

6. Maven

Per aggiungere le dipendenze Spring Persistence al pom, vedere l'esempio Spring with Maven: dovremo definire sia spring-context che spring-orm .

Continuando con Hibernate 3, le dipendenze di Maven sono semplici:

 org.hibernate hibernate-core 3.6.10.Final 

Quindi, per consentire a Hibernate di utilizzare il suo modello proxy, abbiamo bisogno anche di javassist :

 org.javassist javassist 3.18.2-GA 

Useremo MySQL come nostro DB per questo tutorial, quindi avremo anche bisogno di:

 mysql mysql-connector-java 5.1.32 runtime 

Infine, non utilizzeremo l'implementazione dell'origine dati Spring: DriverManagerDataSource ; invece, utilizzeremo una soluzione di pool di connessioni pronta per la produzione: Tomcat JDBC Connection Pool:

 org.apache.tomcat tomcat-dbcp 7.0.55 

7. Conclusione

In questo esempio, abbiamo configurato Hibernate 3 con Spring , sia con Java che con configurazione XML. L'implementazione di questo semplice progetto può essere trovata nel progetto GitHub: questo è un progetto basato su Maven, quindi dovrebbe essere facile da importare ed eseguire così com'è.