Spring整合hibernate3之基础整合
Spring集成hibernate3和4有一定的区别,目前基本都在使用3,所以此处内容以3为基础;
1.导入hibernate的包和Spring的包
1.1.导入Spring的依赖包
1.2.导入Log4j的依赖包:log4j-1.2.16.jar
1.3.导入dbcp的依赖包:commons-dbcp-1.4.jar、commons-pool-1.5.6.jar
1.4.导入hibernate3的依赖包
hibernate全部版本地址:http://sourceforge.net/projects/hibernate/files/hibernate3/
hibernate3.6.8版本地址:http://sourceforge.net/projects/hibernate/files/hibernate3/3.6.8.Final/hibernate-distribution-3.6.8.Final-dist.tar.gz/download
hibernate包含包:hibernate3.jar、slf4j-api-1.6.1.jar、jpa文件夹下包(注解支持).jar、required文件下所有
2.创建beans.xml
2.1.使用dbcp创建dataSource(和集成JDBC一样)
2.2.创建hibernate的SessionFactory
<span style="font-family:FangSong_GB2312;font-size:14px;"> <!-- 创建sessionFactory工厂 -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 设置Spring去那个包中查找相应的实体类 -->
<property name="packagesToScan">
<value>org.oms.spring.model</value>
</property>
<property name="hibernateProperties">
<!--方式2 <value>
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.show_sql=true
hibernate.hbm2ddl.auto=update
hibernate.format_sql=false
</value> -->
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.format_sql">false</prop>
</props>
</property>
</bean></span>
3.为实体类添加hibernate的Annotation或者hbm文件。
4.创建基于hibernate的DAO
4.1.在相应的DAO中注入相应的SessionFactory;
4.2.如果通过Spring来管理相应的sessionFactory,不再使用factory.openSession()开启session,而应该是一factory.getCurrentSession来打开session,这个session就会被Spring管理,
此时开发人员不需要进行事物控制,也不用关闭session,全部由Spring容器来完成!
5.配置Spring的事物处理,只有配置了事物处理之后,Spring才能有效的管理事物;
<span style="font-family:FangSong_GB2312;font-size:14px;"><!-- 配置Spring的事物处理 -->
<!-- 创建事物管理器 -->
<!-- SessionFactory, DataSource, etc. omitted -->
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置AOP,Spring是通过AOP来进行事物管理的 -->
<aop:config>
<!-- 设置pointcut表示哪些方法要加入事物处理 -->
<aop:pointcut id="allMethods"
expression="execution(* org.oms.spring.dao.*.*(..))" />
<!-- 通过advisor来确定具体要加入事物控制的方法 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="allMethods" />
</aop:config>
<!-- 配置哪些方法要加入事物控制 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<!-- 让所有方法都加入事物管理 -->
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
</span>
注意:MySqL中数据表名称和系统表名称相同时,使用Hibernate执行操作时会报语法错误!
因此避免使用系统表名称。
Spring整合hibernate(1)之基础整合源代码下载地址:
具体实现代码:http://download.csdn.net/detail/rzg813/8023653
在文章Spring整合JDBC模板方法设计模式之基于组合的实现的基础上实现整合。
XML文件配置:
<span style="font-size:14px;"><?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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<!-- 打开Spring的Annotation的支持 -->
<context:annotation-config />
<!-- 设定Spring去哪些包中找Annotation -->
<context:component-scan base-package="org.oms.spring" />
<!-- 创建数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- 配置连接池的初始值 -->
<property name="maxActive" value="500" />
<!-- 最大空闲时,当经过一个高峰之后,连接池可以将一些用布到的连接释放,一直减少到maxIdle为止 -->
<property name="maxIdle" value="20" />
<!-- 当最小空闲时,当连接少于minIdle时会自动申请一些连接 -->
<property name="minIdle" value="1" />
<property name="maxWait" value="1000" />
</bean>
<!-- 导入src下的jdbc.properties -->
<context:property-placeholder location="jdbc.properties" />
<!-- 创建sessionFactory工厂 -->
<!-- 如果使用的是Annotation方式不能使用org.springframework.orm.hibernate3.LocalSessionFactoryBean,而应该使用org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 设置Spring去那个包中查找相应的实体类 -->
<property name="packagesToScan">
<value>org.oms.spring.model</value>
</property>
<property name="hibernateProperties">
<!-- <value> hibernate.dialect=org.hibernate.dialect.MySQLDialect hibernate.show_sql=true
hibernate.hbm2ddl.auto=update hibernate.format_sql=false </value> -->
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.format_sql">false</prop>
</props>
</property>
</bean>
<!-- 配置Spring的事物处理 -->
<!-- 创建事物管理器 -->
<!-- SessionFactory, DataSource, etc. omitted -->
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置AOP,Spring是通过AOP来进行事物管理的 -->
<aop:config>
<!-- 设置pointcut表示哪些方法要加入事物处理 -->
<aop:pointcut id="allMethods"
expression="execution(* org.oms.spring.dao.*.*(..))" />
<!-- 通过advisor来确定具体要加入事物控制的方法 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="allMethods" />
</aop:config>
<!-- 配置哪些方法要加入事物控制 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<!-- 让所有方法都加入事物管理(效率低,实际使用中按需处理) -->
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
</beans>
</span>
BaseDao类,此类是抽取了公共配置部分!
<span style="font-size:14px;">package org.oms.spring.dao;
import javax.annotation.Resource;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
public class BaseDao {
private SessionFactory sessionFactory;
public SessionFactory getSessionfactory() {
return sessionFactory;
}
/**
* 名称一致可以不写name
*
* @param sessionfactory
*/
@Resource(name = "sessionFactory")
public void setSessionfactory(SessionFactory sessionfactory) {
this.sessionFactory = sessionfactory;
}
protected Session getSession() {
// 获取session,注意,没有使用openSession().getCurrentSession()
return sessionFactory.getCurrentSession();
}
}
</span>
UserHibernateDao类
<span style="font-size:14px;">package org.oms.spring.dao;
import java.util.List;
import javax.annotation.Resource;
import org.hibernate.Query;
import org.oms.spring.model.Group;
import org.oms.spring.model.User;
import org.springframework.stereotype.Repository;
/**
* User基于Hibernate的CRUD
* @author sunlight
*
*/
@Repository("userHibernateDao")
public class UserHibernateDao extends BaseDao implements IUserDao {
private IGroupDao groupHibernateDao;
public IGroupDao getGroupHibernateDao() {
return groupHibernateDao;
}
@Resource
public void setGroupHibernateDao(IGroupDao groupHibernateDao) {
this.groupHibernateDao = groupHibernateDao;
}
@Override
public void add(User user, int gid) {
Group group=groupHibernateDao.load(gid);
user.setGroup(group);
getSession().save(user);
}
@Override
public void update(User user, int gid) {
Group group=groupHibernateDao.load(gid);
user.setGroup(group);
getSession().update(user);
}
@Override
public void delete(int id) {
User user=this.load(id);
getSession().delete(user);
}
@Override
public User load(int id) {
return (User)getSession().load(User.class, id);
}
@SuppressWarnings("unchecked")
@Override
public List<User> list(String sql, Object[] args) {
//此处基于HQL的查询,好瞌睡!
Query query=this.getSession().createQuery(sql);
if(query!=null){
for (int i = 0; i < args.length; i++) {
query.setParameter(i, args[i]);
}
}
return query.list();
}
}
</span>
GroupHibernateDao类
<span style="font-size:14px;">package org.oms.spring.dao;
import org.oms.spring.model.Group;
import org.springframework.stereotype.Repository;
/**
* Group基于Hibernate的CRUD
* @author sunlight
*
*/
@Repository("groupHibernateDao")
public class GroupHibernateDao extends BaseDao implements IGroupDao {
@Override
public void add(Group group) {
//getSession是通过getCurrentSession来获取Session,它会被Spring所管理,所以不用进行其他操作
getSession().save(group);
}
@Override
public Group load(int id) {
//load() 方法报错,延时加载问题,后面会讲到,此处使用get方法
return (Group)getSession().get(Group.class, id);
}
}
</span>
此处需要在实体类上添加注解:
Group.class
<span style="font-size:14px;">@Entity
@Table(name="T_Group")
主键上添加注解
@Id
@GeneratedValue</span>
User.class
<span style="font-size:14px;">@Entity
@Table(name="T_User")
主键上添加注解
@Id
@GeneratedValue
外键上添加注解
@ManyToOne
@JoinColumn(name="gid")</span>
包类图:
测试类及结果: