zoukankan      html  css  js  c++  java
  • Spring-hibernate

    1, 集成Hibernate3与Hibernate4有一定的区别,这里介绍Hibernate3的集成

    这里的使用的是 :hibernate-distribution-3.6.7.Final

      1)导入hibernate包和Spring包

       hibernate3.jar  libjpahibernate-jpa-2.0-api-1.0.1.Final.jar(支持annotation时需要) lib equired下所有包

       log4j的包 (1.2.17)

       hibernate的log4j.properties文件

      2)beans.xml

        创建dataSource(与集成jdbc一模一样);

        创建Hibernate的SessionFactory

     3)在实体类中创建hibernate的hbm文件或者annotation

     4)创建基于Hibernate的Dao

        在相应的dao中注入相应的sessionFactory

        (如果通过Spring来管理SessionFactory,不再使用openSession()方法,而是使用getCurrentSession()方法来打开一个session,这个session就会被spring所管理,此时开发人员不用进行事务控制,也不用关闭session,全部由Spring来完成)

     5)配置Spring事务管理

    2, 具体过程内容见下面代码

    <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/beans
             http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
             http://www.springframework.org/schema/context
             http://www.springframework.org/schema/context/spring-context-3.0.xsd
                http://www.springframework.org/schema/aop
             http://www.springframework.org/schema/aop/spring-aop.xsd
               http://www.springframework.org/schema/tx
             http://www.springframework.org/schema/tx/spring-tx.xsd">
    
       <!--1, 打开Spring的annotation -->
       <context:annotation-config/>
       <!-- 2, 设定Spring去那些包中找annotation -->
       <context:component-scan base-package="com.yangw.spring" />
        
       <!--
               使用dbcp没有成功, 加的是commons-dbcp-1.4.jar 
            class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        -->
       <bean id="dataSource"
                
                   class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
            <property name="driverClassName" value="${jdbc.driverClassName}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </bean>
         
        <context:property-placeholder location="jdbc.properties"/> 
        
        <!--创建sessionFactory -->
      <bean id="sessionFactory" 
            class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" >
           <!-- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" -->
        <property name="dataSource" ref="dataSource"/>
        <!--  基于XML配置文件的形式
        <property name="mappingResources">
          <list>
            <value>product.hbm.xml</value>
          </list>
        </property>
        -->
        <!-- 自动去包中找hbm文件或者设置了annotation的类-->
        <property name="packagesToScan" value="com.yangw.spring.model" />
        <!-- 将hibernate配置文件放到单独的配置文件中的方式-->
        <!-- 
        <property name="configLocation" value="classpath:hibernate.cfg.xml" />
        -->
        <property name="hibernateProperties">
          <value>
            hibernate.dialect=org.hibernate.dialect.MySQLDialect
            hibernate.show_sql=true
            hibernate.hbm2ddl.auto=update
            hibernate.format_sql=false
          </value>
        </property>
      </bean>
        <!-- 配置Spring事务处理 -->
        <!-- 1,创建事务管理器 -->
          <bean id="transactionManager"
            class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory" />
        </bean>
        <!-- 2, 配置AOP,Spring是通过AOP进行事务管理的-->
       <aop:config>
           <!-- 设置PointCut表示哪些方法要加入事务-->
        <aop:pointcut id="allMethods"
                expression="execution(* com.yangw.spring.dao.*.*(..))"/>
        <!-- 通过advisor来确定具体加入事务控制的方法 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="allMethods"/>
      </aop:config>
        <!--3, 配置哪些方法要加入事务 -->
     
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
            <tx:attributes>
                <tx:method name="get*" read-only="true" />
                <tx:method name="count*" read-only="true" />
                <tx:method name="is*" read-only="true" />
                <tx:method name="has*" read-only="true" />
                <!-- 所有方法都加入事务 -->
                <tx:method name="*"  />
            </tx:attributes>
        </tx:advice>
    </beans>
    package com.yangw.spring.dao;
    
    import javax.annotation.Resource;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    
    public class BaseDao {
    
        @Resource
        private SessionFactory sessionFactory;
        
        protected Session getSession(){
            /*如果通过Spring来管理SessionFactory,不再使用openSession()方法,
             *而是使用getCurrentSession()方法来打开一个session,这个session就会被spring所管理,
             *此时开发人员不用进行事务控制,也不用关闭session,全部由Spring来完成
             */
            return sessionFactory.getCurrentSession();
        }
    
        public SessionFactory getSessionFactory() {
            return sessionFactory;
        }
    
    }
    package com.yangw.spring.dao;
    
    import java.util.List;
    
    import com.yangw.spring.model.User;
    
    public interface IUserDao {
    
        public void addUser(User user);
        
        public void delUser(int id);
        
        public User loadUser(int id);
        
        public List<User> loadAllUser();
    }
    package com.yangw.spring.dao;
    
    import java.util.List;
    
    import org.springframework.stereotype.Repository;
    
    import com.yangw.spring.model.User;
    
    @Repository("userHibernateDao")
    public class UserDao extends BaseDao implements IUserDao {
    
        @Override
        public void addUser(User user) {
            
            getSession().save(user);
        }
    
        @Override
        public void delUser(int id) {
            // TODO Auto-generated method stub
            
        }
    
        @Override
        public User loadUser(int id) {
            // load()方法时,有错误,因为懒加载
            return (User) getSession().get(User.class, id);
            
        }
    
        @Override
        public List<User> loadAllUser() {
            // TODO Auto-generated method stub
            return null;
        }
    
    }
    package com.yangw.spring.test;
    
    import javax.annotation.Resource;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import com.yangw.spring.dao.IUserDao;
    import com.yangw.spring.model.User;
    
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("/beans.xml")
    /**
     * 当使用了@RunWith,@ContextConfiguration注解之后,就可以直接在Test中进行依赖注入
     * @author Administrator
     */
    public class TestHibernate {
        
        @Resource
        private IUserDao userHibernateDao;
       
        @Test
        public void testAdd(){
            
           User user=new User();
           user.setName("wangwu");
           user.setAge(21);
           userHibernateDao.addUser(user);
        }
        
        @Test
        public void testLoad(){
            
       
          User user = userHibernateDao.loadUser(4);
          System.out.println(user);
        }
    
    
    }

     3, 使用HibernateTemplate进行操作

       在配置文件中,再注入HibernateTemplate

      <!-- 使用HibernateTemplate进行操作时需要-->
      <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
          <property name="sessionFactory" ref="sessionFactory"></property>
      </bean>
    package com.yangw.spring.dao;
    
    import javax.annotation.Resource;
    
    import org.springframework.orm.hibernate3.HibernateTemplate;
    
    public class BaseDao1 {
    
        @Resource
        private HibernateTemplate hibernateTemplate;
    
        public HibernateTemplate getHibernateTemplate() {
            return hibernateTemplate;
        }
    
        public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
            this.hibernateTemplate = hibernateTemplate;
        }
        
    }
    package com.yangw.spring.dao;
    
    import java.util.List;
    
    import org.springframework.stereotype.Repository;
    
    import com.yangw.spring.model.User;
    
    @Repository("userHibernateDao1")
    public class UserDao1 extends BaseDao1 implements IUserDao {
    
        @Override
        public void addUser(User user) {
            
            getHibernateTemplate().save(user);
        }
    
        @Override
        public void delUser(int id) {
            User user=this.loadUser(id);
            getHibernateTemplate().delete(user);
        }
    
        @Override
        public User loadUser(int id) {
            return (User) getHibernateTemplate().get(User.class, id);
            
        }
    
        @SuppressWarnings("unchecked")
        @Override
        public List<User> loadAllUser() {
            String hql="select * from User";
            return (List<User>) getHibernateTemplate().getSessionFactory().getCurrentSession().createQuery(hql);
        }
    }
    package com.yangw.spring.test;
    
    import javax.annotation.Resource;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import com.yangw.spring.dao.IUserDao;
    import com.yangw.spring.model.User;
    
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("/beans.xml")
    /**
     * 当使用了@RunWith,@ContextConfiguration注解之后,就可以直接在Test中进行依赖注入
     * @author Administrator
     */
    public class TestHibernate {
        
        @Resource
        private IUserDao userHibernateDao1;
       
        @Test
        public void testAdd(){
            
           User user=new User();
           user.setName("wangwu");
           user.setAge(21);
           userHibernateDao1.addUser(user);
        }
        
        @Test
        public void testLoad(){
            
       
          User user = userHibernateDao1.loadUser(4);
          System.out.println(user);
        }
    
    
    }

     3, 使用HibernateDaoSupport类

    package com.yangw.spring.dao;
    
    import javax.annotation.Resource;
    
    import org.hibernate.SessionFactory;
    import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
    
    public class BaseDao2 extends HibernateDaoSupport{
    
        //注入SessionFactory
        @Resource(name="sessionFactory")
        public void setSuperSessionFactory(SessionFactory sessionFactory){
            super.setSessionFactory(sessionFactory);
        }
        
    }

    有了HibernateDaoSupport,就可以使用HibernateTemplate了

    package com.yangw.spring.dao;
    
    import java.util.List;
    
    import org.springframework.stereotype.Repository;
    
    import com.yangw.spring.model.User;
    
    @Repository("userHibernateDao2")
    public class UserDao2 extends BaseDao2 implements IUserDao {
    
        @Override
        public void addUser(User user) {
            
            getHibernateTemplate().save(user);
        }
    
        @Override
        public void delUser(int id) {
            User user=this.loadUser(id);
            getHibernateTemplate().delete(user);
        }
    
        @Override
        public User loadUser(int id) {
            // load()方法时,有错误,因为懒加载
            return (User) getHibernateTemplate().get(User.class, id);
            
        }
    
        @SuppressWarnings("unchecked")
        @Override
        public List<User> loadAllUser() {
            String hql="select * from User";
            return (List<User>) getHibernateTemplate().getSessionFactory().getCurrentSession().createQuery(hql);
        }
    
    
    
    }

    测试就不写了

    ----------- 赠人玫瑰,手有余香     如果本文对您有所帮助,动动手指扫一扫哟   么么哒 -----------


    未经作者 https://www.cnblogs.com/xin1006/ 梦相随1006 同意,不得擅自转载本文,否则后果自负
  • 相关阅读:
    java线程实现和集合类综合问题
    软件体系结构风格总结
    java如何实现对象的克隆
    24小时实现盲打(程序员快速入门)
    测试面向对象软件时,设计集成测试用例的方法
    对白盒测试的一些理解
    对于工程建模需要画的图的分析及体会
    在软件开发的早期阶段为什么要进行可行性研究?应该从哪些方面研究目标系统的可行性?
    谭静第一周任务
    陈林艳第一周任务
  • 原文地址:https://www.cnblogs.com/xin1006/p/3384153.html
Copyright © 2011-2022 走看看