天天看点

Spring集成Hibernate

Spring集成Hibernate

一、环境搭建

开发工具:Spring Tool Suite v_3.9.3(简称STS)

依赖包管理(pom.xml):

<!-- Spring ORM -->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-orm</artifactId>
	<version>${spring.version}</version>
</dependency>

<!-- Hibernate -->
<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-core</artifactId>
	<version>4.2.0.Final</version>
</dependency>

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>druid</artifactId>
	<version>1.0.25</version>
</dependency>

<!-- Oracle数据库支持 -->
<dependency>
	<groupId>com.oracle</groupId>
	<artifactId>ojdbc6</artifactId>
	<version>11.2.0.1.0</version>
</dependency>

<!-- MySQL数据库支持 -->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.9</version>
</dependency>
           

配置DataSource(spring-context.xml):

<?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"
	xmlns:util="http://www.springframework.org/schema/util"
	xmlns:jee="http://www.springframework.org/schema/jee"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:jpa="http://www.springframework.org/schema/data/jpa"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
		http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
		http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

	<!-- 开启注解 -->
	<context:annotation-config />

	<!-- 配置组件扫描 -->
	<context:component-scan base-package="com.info.*"></context:component-scan>

	<!-- 加载配置文件 -->
	<context:property-placeholder location="classpath*:application.properties" />

	<!-- 配置数据连接池 -->
	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<!-- <property name="driverClassName" value="${jdbc.driverClassName}" /> --> <!-- MySQL数据库需要指定驱动 -->

		<!-- 连接池初始值 -->
		<property name="initialSize" value="1" />
		<!-- 连接池最大值 -->
		<property name="maxActive" value="300" />
		<!-- 连接池最小空闲值 -->
		<property name="minIdle" value="1" />
		<!-- 配置获取连接等待超时的时间 -->
		<property name="maxWait" value="60000" />
		<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
		<property name="timeBetweenEvictionRunsMillis" value="60000" />
		<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
		<property name="minEvictableIdleTimeMillis" value="300000" />
		<property name="validationQuery" value="SELECT 'x' FROM DUAL" />
		<property name="testWhileIdle" value="true" />
		<property name="testOnBorrow" value="false" />
		<property name="testOnReturn" value="false" />
	</bean>
	
	<!-- 配置SessionFactory,由Spring容器来管理Hibernate -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> <!-- 指定数据库方言 -->
				<!--<prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop> --> <!-- MySQL数据库 -->
				<prop key="hibernate.hbm2ddl.auto">update</prop>     <!-- Hibernate根据实体自动生成数据库表 -->
				<prop key="hibernate.show_sql">false</prop>          <!-- 在控制台显示执行的数据库操作语句 -->
				<prop key="hibernate.format_sql">false</prop>        <!-- 在控制台显示执行的数据哭操作语句(格式)-->
				<prop key="hibernate.connection.release_mode">after_transaction</prop>
			</props>
		</property>
		<property name="packagesToScan">
			<list>
				<value>com.info.*</value>
			</list>
		</property>
	</bean>

	<!-- 事物管理器配置 -->
	<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>
	
	<!-- 支持注解方式声明式事务 -->
	<tx:annotation-driven transaction-manager="transactionManager"/>
	
</beans>
           

二、测试

POJO

package com.info.po;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name = "IDC_ALARM_BORD", schema = "CATH_THINKOPS")
public class AlarmBord {

	@Id
	@GeneratedValue(generator = "paymentableGenerator")
	@GenericGenerator(name = "paymentableGenerator", strategy = "increment")
	@Column(name = "ID", unique = true, nullable = false)
	private Long id;

	@Column(name = "ALARM_ID")
	private String alarmId;

	@Column(name = "ALARM_TITLE")
	private String alarmTitle;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getAlarmId() {
		return alarmId;
	}

	public void setAlarmId(String alarmId) {
		this.alarmId = alarmId;
	}

	public String getAlarmTitle() {
		return alarmTitle;
	}

	public void setAlarmTitle(String alarmTitle) {
		this.alarmTitle = alarmTitle;
	}

}

           

Dao:

package com.info.dao;

import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@Repository
@Transactional 
public class AlarmDto extends HibernateDaoSupport {

	// 继承HibernateDaoSupport后需要添加该方法
	@Autowired
	public void setSessionFactoryOverride(SessionFactory sessionFactory) {
		super.setSessionFactory(sessionFactory);
	}
	
	public void find() {
		/*
		 *  获取Session
		 *  openSession():每次打开都是新的Session,所以多次获取的Session实例是不同的,并且需要人为的调用close方法进行Session关闭
		 *  getCurrentSession():是从当前上下文中获取Session并且会绑定到当前线程,第一次调用时会创建一个Session实例,
		 *                       如果该Session未关闭,后续多次获取的是同一个Session实例;事务提交或者回滚时会自动关闭Sesison,无需人工关闭
		 *  getCurrentSession方法需求加上事务控制(在Spring中配置事务管理,添加@Transactional注解)
		 */
		this.getSessionFactory();
		
		String hql = "from AlarmBord";
		Query query = this.getSessionFactory().getCurrentSession().createQuery(hql);
//		Query query = this.getSessionFactory().openSession().createQuery(hql);
		System.out.println(query.list());
	}
}

           

三、集成spring data jpa

添加依赖包:

<!-- Spring data JPA -->
<dependency>
	<groupId>org.springframework.data</groupId>
	<artifactId>spring-data-jpa</artifactId>
	<version>1.4.2.RELEASE</version>
</dependency>

<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-entitymanager</artifactId>
	<version>4.2.0.Final</version>
</dependency>
           

配置Data JPA:

<?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"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:jpa="http://www.springframework.org/schema/data/jpa"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 开启注解 -->
    <context:annotation-config />

    <!-- 配置组件扫描 -->
    <context:component-scan base-package="com.info.*"></context:component-scan>

    <!-- 加载配置文件 -->
    <context:property-placeholder location="classpath*:application.properties" />

    <!-- 配置数据连接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <!-- <property name="driverClassName" value="${jdbc.driverClassName}" /> --> <!-- MySQL数据库需要指定驱动 -->

        <!-- 连接池初始值 -->
        <property name="initialSize" value="1" />
        <!-- 连接池最大值 -->
        <property name="maxActive" value="300" />
        <!-- 连接池最小空闲值 -->
        <property name="minIdle" value="1" />
        <!-- 配置获取连接等待超时的时间 -->
        <property name="maxWait" value="60000" />
        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000" />
        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="300000" />
        <property name="validationQuery" value="SELECT 'x' FROM DUAL" />
        <property name="testWhileIdle" value="true" />
        <property name="testOnBorrow" value="false" />
        <property name="testOnReturn" value="false" />
    </bean>

	<!-- 配置JdbcTempalte -->
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<constructor-arg index="0" ref="dataSource" />
	</bean>

    <!-- 配置SessionFactory,由Spring容器来管理Hibernate -->
    <!-- <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> 指定数据库方言
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop> MySQL数据库
                <prop key="hibernate.hbm2ddl.auto">update</prop>     Hibernate根据实体自动生成数据库表
                <prop key="hibernate.show_sql">false</prop>          在控制台显示执行的数据库操作语句
                <prop key="hibernate.format_sql">false</prop>        在控制台显示执行的数据哭操作语句(格式)
                <prop key="hibernate.connection.release_mode">after_transaction</prop>
            </props>
        </property>
        <property name="packagesToScan">
            <list>
                <value>com.info.*</value>
            </list>
        </property>
    </bean> -->

    <!-- 事物管理器配置 -->
    <!-- <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean> -->

    <!-- 支持注解方式声明式事务 -->
    <!-- <tx:annotation-driven transaction-manager="transactionManager"/> -->

	<!-- Spring JPA配置 -->
	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<!-- 数据源 -->
		<property name="dataSource" ref="dataSource"/>
		<!-- 适配器 -->
		<property name="jpaVendorAdapter">
        	<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"></bean>
        </property>
        <property name="jpaProperties">  
            <props>  
                <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>  
                <prop key="hibernate.show_sql">false</prop>  
                <prop key="hibernate.format_sql">true</prop>  
                <prop key="hibernate.hbm2ddl.auto">update</prop>  
            </props>  
        </property>  
        <property name="packagesToScan">  
            <list>  
                <value>com.info.*</value>  
            </list>  
        </property> 
	</bean>
	
	<!-- 事务管理器 -->  
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    	<property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean> 
    
    <tx:annotation-driven/>
    
    <!-- JPA空间配置 -->
    <jpa:repositories base-package="com.info.dao" entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="transactionManager"/>

</beans>
           

Dao使用:

package com.info.dao;

import java.util.List;

import org.springframework.data.repository.Repository;

import com.info.po.AlarmBord;

public interface Alarm extends Repository<AlarmBord, Long> {

	List<AlarmBord> findAll();
}