1.概述
本文将重点介绍通过Spring设置Hibernate 3 –我们将研究如何同时使用XML和Java配置通过Hibernate 3和MySQL设置Spring 3。
2. Hibernate 3的Java Spring配置
使用Spring和Java配置来设置Hibernate 3很简单:
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.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[] { "org.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
public HibernateTransactionManager transactionManager() {
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(sessionFactory().getObject());
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配置(如下所述)相比,配置中的一个Bean访问另一个Bean的方式略有不同。 在XML中, 指向bean或指向能够创建该bean的bean工厂之间没有区别。 由于Java配置是类型安全的–不再直接指向Bean工厂-我们需要手动从Bean工厂中检索Bean:
txManager.setSessionFactory(sessionFactory().getObject());
同样,我们也可以使用XML配置来设置Hibernate 3 :
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<context:property-placeholder location="classpath:persistence-mysql.properties" />
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="org.baeldung.spring.persistence.model" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
</props>
</property>
</bean>
<bean id="dataSource"
class="org.apache.tomcat.dbcp.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.user}" />
<property name="password" value="${jdbc.pass}" />
</bean>
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="persistenceExceptionTranslationPostProcessor"
class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
</beans>
然后,使用@Configuration类将该XML文件引导到Spring上下文中:
@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属性配置驱动程序类名称。
在上面的示例中,从本文开头的pom中定义的mysql-connector-java依赖项将其设置为com.mysql.jdbc.Driver 。
4.2。 方言
通过提供给Hibernate SessionFactory 的hibernate.dialect属性配置方言。
在上面的示例中,将其设置为org.hibernate.dialect.MySQL5Dialect,因为我们使用MySQL 5作为基础数据库。 还有其他几种支持MySQL的方言 :
- org.hibernate.dialect.MySQL5InnoDBDialect –用于带有InnoDB存储引擎的MySQL 5.x
- org.hibernate.dialect.MySQLDialect –适用于5.x之前的MySQL
- org.hibernate.dialect.MySQLInnoDBDialect –适用于使用InnoDB存储引擎的5.x之前的MySQL
- org.hibernate.dialect.MySQLMyISAMDialect –适用于带有ISAM存储引擎的所有MySQL版本
5.用法
至此,Hibernate 3已通过Spring进行了完整配置,我们可以在需要时直接注入原始的Hibernate SessionFactory :
public abstract class FooHibernateDAO{
@Autowired
SessionFactory sessionFactory;
...
protected Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
}
6. Maven
要将Spring Persistence依赖项添加到pom,请参见Spring with Maven示例 –我们需要定义spring-context和spring-orm 。
继续使用Hibernate 3,Maven依赖项很简单:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.6.10.Final</version>
</dependency>
然后,要使Hibernate使用其代理模型,我们还需要javassist :
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.18.0-GA</version>
</dependency>
在本教程中,我们将使用MySQL作为数据库,因此我们还需要:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.25</version>
<scope>runtime</scope>
</dependency>
最后,我们将不再使用Spring数据源实现– DriverManagerDataSource ; 相反,我们将使用可用于生产环境的连接池解决方案– Tomcat JDBC连接池:
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-dbcp</artifactId>
<version>7.0.41</version>
</dependency>
7.结论
在这个示例中, 我们使用Spring配置了Hibernate 3 –都使用Java和XML配置。 这个简单项目的实现可以在github项目中找到–这是一个基于Eclipse的项目,因此应易于导入和运行。
翻译自: https://www.javacodegeeks.com/2013/05/hibernate-3-with-spring.html