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'è.