spring3与hibernate4的整合

 首先,spring与hibernate3整合时有三种方式:1、直接使用SessionFactory(该SessionFactory由spring管理并注入)的方式:
           
 @Resource
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
protected Session getsSession(){
return this.sessionFactory.getCurrentSession();
}
         

            其次、利用HibernateTemplate类提供的模板方式:
         
 <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
      <constructor-arg name="sessionFactory" ref="sessionFactory"/>
</bean> 
         
 @Resource(name="sessionFactory")
public void setHibernateTemplate(SessionFactory sessionFactory) {
this.hibernateTemplate =new HibernateTemplate(sessionFactory);
}  


     
           再者:利用HibernateDaoSupport类。

在Spring与hibernate4的整合中,已经取消了HibernateTemplate和HibernateDaoSupport这两个方法只能通过session来进行处理。
和hibernate4整合没有提供专门的针对Annotation的类,直接在LocalSessionFactoryBean中已经集成
    
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">  

        
 
事务管理也要改成hibernate4的支持
<!-- 创建事务管理器-->
<bean id="txManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">

如果通过Spring来管理相应的SessionFactory,不再使用factory.openSession()开启session,而应该是一facotry.getCurrentSession来打开Session,这个Session就会被Spring所管理,此时开发人员不用进行事务控制,也不用关闭Session,全部有Spring容器来完成
只有配置了事务处理之后,Spring才能有效的管理事务
<!-- 配置Spring的事务处理 -->
<!-- 创建事务管理器-->
<bean id="txManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置AOP,Spring是通过AOP来进行事务管理的 -->
<aop:config>
<!-- 设置pointCut表示哪些方法要加入事务处理 -->
<aop:pointcut id="allMethods"
expression="execution(* com.tc.spring.service.*.*(..))" />
<!-- 通过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>
    


 也可通过注解的方式实现事务管理:
       
       
<tx:annotation-driven transaction-manager="transactionManager" /> <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>

        在要进行事务管理的类和方法中分别添加如下注解:
       
 
@Transactional
public class BaseDao<T,PK extends Serializable> implements IBaseDao<T, PK>

 @Override
@Transactional(propagation=Propagation.REQUIRED,readOnly=true)
public List<T> list(String sql, Object... args) {
Query query=this.getSession().createQuery(sql);
if(args!=null){
for(int i=0;i<args.length;i++){
query.setParameter(i, args[i]);
}
}
return query.list();
}

@Override
@Transactional(propagation=Propagation.REQUIRED,readOnly=true)
public T findById(PK id) {
return (T)this.getSession().get(clazz, id);
}

@Override
@Transactional(propagation=Propagation.REQUIRED)
public void save(T t) {
this.getSession().save(t);
}

  
OpenSessionInViewer也要改成基于4的版本

<filter>
<filter-name>openSessionInViewerFilter</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class> 
 </filter>


如果数据库使用oracle则要注意ojdbc14jar包与hibernate4有冲突,需要使用objec6jar包,同样ojdbc6jar包与hibernate3有冲突,大家在使用时需要注意。
另外Hibernate4对DTO不在支持如下的方式:

 session.createSQLQuery("select * from student s inner join grade g on s.g_id=g.gid")
                .addScalar("stu_id", Hibernate.INTEGER)
                .addScalar("stu_name",Hibernate.STRING)
                .addScalar("g_name",Hibernate.STRING)
                .setResultTransformer(Transformers.aliasToBean(StudentDTO.class))
                .list(); 


猜你喜欢

转载自blog.csdn.net/tonysong111073/article/details/14517227