(九)sping之合并hibernate配置

来源:互联网 发布:怎么不自动更新软件 编辑:程序博客网 时间:2024/05/16 05:29

有时候为了为了操作方便,我们时常在spring整合hibernate的WEB项目中省去了用hibernate.cfg.xml的麻烦,将hibernate的信息直接配置在Spring配置文件中

下面的都是针对Spring整合Hibernate(注解方式的hibernate)来说的

 SH整合必须包



 其中spring必须包spring.jar和common-logging.jar

      hibernate必须包hibernate.jar和六个其他必须包

      剩下的就是用于数据连接的数据库连接包mysql.jar

      用于注解的jpa.jar

      用于连接池的c3p0.jar

      用于测试的junit.jar

hibernate.cfg.xml和applicationContext.xml原始配置组合方式:

 hibernate.cfg.xml


Xml代码  收藏代码
  1. <span style="font-size: large;"><span style="font-size: large;"><span style="font-size: large;"><?xml version="1.0" encoding="utf-8" ?>  
  2. <!DOCTYPE hibernate-configuration PUBLIC  
  3.     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  5.   
  6. <hibernate-configuration>  
  7.     <session-factory>  
  8.         <!--  
  9.             这个只在DBScriptExport.java的new AnnotationConfiguration().configure()或者  
  10.             new Configuration().configure();这里面由于生成数据库表,或者通过  
  11.             config.buildSessionFactory都需要用到下面这四行关于数据库的配置.实际项目中,  
  12.             如果不适用到硬编码做这两件事,而是通过和Spring配合,那么这四行可以不写  
  13.         -->  
  14.         <!--  
  15.             <property name="hibernate.current_session_context_class">thread</property>  
  16.             <property name="connection.driver_class">com.mysql.jdbc.Driver</property>  
  17.             <property name="connection.url">jdbc:mysql:///test</property>  
  18.             <property name="connection.username">root</property>   
  19.             <property name="connection.password">root</property>  
  20.         -->  
  21.         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>  
  22.         <property name="show_sql">true</property>  
  23.         <property name="format_sql">true</property>  
  24.         <!-- mapping类声明-->  
  25.         <mapping class="com.javacrazyer.domain.User" />  
  26.     </session-factory>  
  27. </hibernate-configuration></span></span></span>  

 


上面注释其实也没讲清楚,其实就是如果单独的hibernate项目来说,如果涉及到数据库操的任何操作代码,那么你必须配那段被注释掉的数据库连接信息,如果是整合Spring的话,那么就不用配置了,Spring提供了对hibernate支持的SessionFactory可以再注入后获取SESSION,然后你就可以任意去实现数据库操作了

 applicationContext.xml


Xml代码  收藏代码
  1. <span style="font-size: large;"><span style="font-size: large;"><span style="font-size: large;"><?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"  
  4.     xmlns:tx="http://www.springframework.org/schema/tx"  
  5.     xsi:schemaLocation="  
  6.             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  7.             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
  8.             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
  9.   
  10.     <!-- 使用C3P0的连接池技术 -->  
  11.     <bean id="dataSource" destroy-method="close"  
  12.         class="com.mchange.v2.c3p0.ComboPooledDataSource">  
  13.         <property name="driverClass" value="com.mysql.jdbc.Driver" />  
  14.         <property name="jdbcUrl" value="jdbc:mysql:///test" />  
  15.         <property name="user" value="root" />  
  16.         <property name="password" value="root" />  
  17.         <!-- 指定连接数据库连接池的最大连接数 -->  
  18.         <property name="maxPoolSize" value="20" />  
  19.         <!-- 指定连接数据库连接池的最小连接数 -->  
  20.         <property name="minPoolSize" value="1" />  
  21.         <!-- 指定连接数据库连接池的初始化连接数 -->  
  22.         <property name="initialPoolSize" value="1" />  
  23.         <!-- 指定连接数据库连接池的连接的最大空闲时间 -->  
  24.         <property name="maxIdleTime" value="20" />  
  25.     </bean>  
  26.     <bean id="sessionFactory"  
  27.         class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">  
  28.         <!--指定hibernate配置文件的位置-->  
  29.         <property name="configLocation" value="classpath:hibernate.cfg.xml" />  
  30.         <!--  
  31.         那么这里给sessionFactory注入dataSource的解释:其实就是相当于单独的hibernate项目中使用  
  32.         config.buildSessionFactory()这样手动构建SessionFactory一样,必须提供有关数据库的参数配  
  33.         置信息也就是在hibernate.cfg.xm中 配置的数据库信息,这样使用session才能关联上数据库  
  34.         -->  
  35.         <property name="dataSource" ref="dataSource" />  
  36.     </bean>  
  37.   
  38.     <!--如果不配置SessionFactory,配置Spring自带的JdbcTemplate也挺好,然后注入到需要用到的类中去-->  
  39.     <!--  
  40.         <bean id="jdbcTemplate"  
  41.         class="org.springframework.jdbc.core.JdbcTemplate">  
  42.         <description>Config jdbcTemplate</description> <property  
  43.         name="dataSource" ref="dataSource" /> </bean>  
  44.     -->  
  45.   
  46.     <!--  
  47.         下面是Hibernate的事务管理器 ,如果是单独spring框架的项目中配置spring事务,那么就没有上边  
  48.         的sessionFactory而只会有dataSource,那么下面属性就不是sesionFactory而是DataSource了  
  49.     -->  
  50.     <bean id="transactionManager"  
  51.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  52.         <property name="sessionFactory" ref="sessionFactory" />  
  53.     </bean>  
  54.   
  55.     <!-- 启用注解方式的声明式事务支持 -->  
  56.     <tx:annotation-driven transaction-manager="transactionManager" />  
  57.   
  58.     <!-- =============================================== -->  
  59.     <bean id="userDao" class="com.javacrazyer.dao.UserDaoHibernateImpl">  
  60.         <property name="sessionFactory" ref="sessionFactory" />  
  61.     </bean>  
  62.   
  63.     <bean id="sf" class="com.javacrazyer.service.ServiceFacade">  
  64.         <property name="userDao" ref="userDao" />  
  65.     </bean>  
  66. </beans></span></span></span>  

   当然这个配置中的sessionFactory是针对注解方式的配置的,如果是非注解方式的应该是:org.springframework.orm.hibernate3.LocalSessionFactoryBean

  上面关于SessionFactory注释说过了,如果不需要hibernate有关数据库的操作的话,那么就不要结合hibernate框架而是通过Spring自带的JdbcTemplate来进行数据库操作


不要hibernate.cfg.xml,将hibernate基本信息配置在applicatonContext.xm中


applicationContext.xml



Xml代码  收藏代码
  1. <span style="font-size: large;"><span style="font-size: large;"><span style="font-size: large;"><?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"  
  4.     xmlns:tx="http://www.springframework.org/schema/tx"  
  5.     xsi:schemaLocation="  
  6.             http://www.springframework.org/schema/beans   
  7.             http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  8.             http://www.springframework.org/schema/aop   
  9.             http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
  10.             http://www.springframework.org/schema/tx   
  11.             http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
  12.     <!-- 使用C3P0的连接池技术 -->  
  13.     <bean id="dataSource" destroy-method="close"  
  14.         class="com.mchange.v2.c3p0.ComboPooledDataSource">  
  15.         <property name="driverClass" value="com.mysql.jdbc.Driver" />  
  16.         <property name="jdbcUrl" value="jdbc:mysql:///test" />  
  17.         <property name="user" value="root" />  
  18.         <property name="password" value="root" />  
  19.         <!-- 指定连接数据库连接池的最大连接数 -->  
  20.         <property name="maxPoolSize" value="20" />  
  21.         <!-- 指定连接数据库连接池的最小连接数 -->  
  22.         <property name="minPoolSize" value="1" />  
  23.         <!-- 指定连接数据库连接池的初始化连接数 -->  
  24.         <property name="initialPoolSize" value="1" />  
  25.         <!-- 指定连接数据库连接池的连接的最大空闲时间 -->  
  26.         <property name="maxIdleTime" value="20" />  
  27.     </bean>  
  28.   
  29.     <bean id="sessionFactory"  
  30.         class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">  
  31.         <property name="dataSource">  
  32.             <ref bean="dataSource" />  
  33.         </property>  
  34.         <property name="hibernateProperties">  
  35.             <props>  
  36.                 <prop key="dialect">  
  37.                     org.hibernate.dialect.MySQLDialect  
  38.                 </prop>  
  39.                 <prop key="format_sql">true</prop>  
  40.                 <prop key="show_sql">true</prop>  
  41.                 <prop key="cache.use_query_cache">true</prop>  
  42.                 <prop key="cache.provider_class">  
  43.                     org.hibernate.cache.HashtableCacheProvider  
  44.                 </prop>  
  45.                 <prop key="cache.provider_class">  
  46.                     org.hibernate.cache.EhCacheProvider  
  47.               </prop>  
  48.             </props>  
  49.         </property>  
  50.   
  51.            <!-- 针对xml而非注解方式的资源配置方式一 -->  
  52.              <!-- <property name="mappingResources"> <list>  
  53.             <value>com/javacrazyer/domain/user.hbm.xml</value> </list>  
  54.             </property> -->  
  55.             <!-- 针对xml而非注解方式的资源配置方式二 -->  
  56.              <!--<property name="mappingLocations"> <list> <value>  
  57.             classpath:com/javacrazyer/domain/user.hbm.xml </value> </list>  
  58.             </property>-->  
  59.           
  60.         <property name="annotatedClasses">  
  61.             <list>  
  62.                 <value>com.javacrazyer.domain.User</value>  
  63.             </list>  
  64.         </property>  
  65.     </bean>  
  66.   
  67.       
  68.     <!--  
  69.         下面是Hibernate的事务管理器 ,如果是单独spring框架的项目中配置spring事务,那么就没有上边  
  70.         的sessionFactory而只会有dataSource,那么下面属性就不是sesionFactory而是DataSource了  
  71.     -->  
  72.     <bean id="transactionManager"  
  73.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  74.         <property name="sessionFactory" ref="sessionFactory" />  
  75.     </bean>  
  76.   
  77.     <!-- 启用注解方式的声明式事务支持 -->  
  78.     <tx:annotation-driven transaction-manager="transactionManager" />  
  79.   
  80.     <!-- =============================================== -->  
  81.     <bean id="userDao" class="com.javacrazyer.dao.UserDaoHibernateImpl">  
  82.         <property name="sessionFactory" ref="sessionFactory" />  
  83.     </bean>  
  84.   
  85.     <bean id="sf" class="com.javacrazyer.service.ServiceFacade">  
  86.         <property name="userDao" ref="userDao" />  
  87.     </bean>  
  88.   
  89. </beans></span></span></span>  

    关于上面两种配置hbm.xml文件的方式,如果文件有几十个的话,没必要多写出来可以写成通配符的样子,如下

Xml代码  收藏代码
  1. <span style="font-size: large;"><property name="mappingResources">   
  2. <list>    
  3.  <value>classpath:com/javacrazyer/**/*.hbm.xml</value>  
  4.  </list>    
  5. </property> </span>  

  

注意与第一种方式不同的是applicatonContext.xml中只有sessionFactory发生了变化,数据源依旧注入到里面去,原来该配置hibernate.cfg.xml文件位置的配置现在换成了,众多行与第一种方式中hibernate.cfg.xml中类似的信息配置。

这样来说呢,更加省事些,当然我指的是SH结合的情况下,如果是hibernate单独的项目,必然用到new AnnotationConfiguration.config()就必然需要默认查找src下的hibernate.cfg.xml

用到的User.java


Java代码  收藏代码
  1. <span style="font-size: large;"><span style="font-size: large;">package com.javacrazyer.domain;  
  2.   
  3. import javax.persistence.Entity;  
  4. import javax.persistence.GeneratedValue;  
  5. import javax.persistence.Id;  
  6. import javax.persistence.Table;  
  7.   
  8. @Entity  
  9. @Table(name="user")  
  10. public class User {  
  11.     @Id  
  12.     @GeneratedValue  
  13.     private Long id;  
  14.     private String username;  
  15.     private String pwd;  
  16.       
  17.       
  18.     public Long getId() {  
  19.         return id;  
  20.     }  
  21.     public void setId(Long id) {  
  22.         this.id = id;  
  23.     }  
  24.     public String getUsername() {  
  25.         return username;  
  26.     }  
  27.     public void setUsername(String username) {  
  28.         this.username = username;  
  29.     }  
  30.     public String getPwd() {  
  31.         return pwd;  
  32.     }  
  33.     public void setPwd(String pwd) {  
  34.         this.pwd = pwd;  
  35.     }  
  36.       
  37.     public String toString(){  
  38.         return "id=" + id + ",username=" + username + ",pwd=" + pwd;  
  39.     }  
  40.       
  41. }  
  42. </span></span>  

 


UserDao.java


Java代码  收藏代码
  1. <span style="font-size: large;"><span style="font-size: large;">package com.javacrazyer.dao;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.List;  
  5.   
  6. import com.javacrazyer.domain.User;  
  7.   
  8. public interface UserDao {  
  9.     void add(User user);  
  10.     void delete(User user);  
  11.     void update(User user);  
  12.     User findById(Serializable id);  
  13.       
  14.     List<User> findAll();  
  15. }  
  16. </span></span>  

 


UserDaoHibernateImpl.java


Java代码  收藏代码
  1. <span style="font-size: large;"><span style="font-size: large;">package com.javacrazyer.dao;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.List;  
  5.   
  6. import org.hibernate.SessionFactory;  
  7.   
  8. import com.javacrazyer.domain.User;  
  9.   
  10. public class UserDaoHibernateImpl implements UserDao {  
  11.       
  12.     private SessionFactory sessionFactory;  
  13.       
  14.     public void setSessionFactory(SessionFactory sessionFactory) {  
  15.         this.sessionFactory = sessionFactory;  
  16.     }  
  17.   
  18.       
  19.     public void add(User user) {  
  20.         this.sessionFactory.getCurrentSession().save(user);  
  21.     }  
  22.   
  23.       
  24.     public void delete(User user) {  
  25.         this.sessionFactory.getCurrentSession().delete(user);  
  26.     }  
  27.   
  28.   
  29.     public List<User> findAll() {  
  30.         return (List<User>)this.sessionFactory.getCurrentSession().createQuery("from User").list();  
  31.     }  
  32.   
  33.       
  34.     public User findById(Serializable id) {  
  35.         return (User)this.sessionFactory.getCurrentSession().load(User.class, id);  
  36.     }  
  37.   
  38.       
  39.     public void update(User user) {  
  40.         user = (User)this.sessionFactory.getCurrentSession().merge(user);  
  41.     }  
  42.   
  43. }  
  44. </span></span>  



门面服务类ServiceFacade .java


Java代码  收藏代码
  1. <span style="font-size: large;"><span style="font-size: large;">package com.javacrazyer.service;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.springframework.transaction.annotation.Isolation;  
  6. import org.springframework.transaction.annotation.Transactional;  
  7.   
  8. import com.javacrazyer.dao.UserDao;  
  9. import com.javacrazyer.domain.User;  
  10.   
  11. @Transactional(isolation=Isolation.READ_COMMITTED)  
  12. public class ServiceFacade {  
  13.       
  14.     //依赖的对象:主动去获取  
  15.     private UserDao userDao;  
  16.       
  17.     public ServiceFacade(){}  
  18.       
  19.     //构造器  
  20.     public ServiceFacade(UserDao userDao){  
  21.         this.userDao = userDao;  
  22.           
  23.     }  
  24.       
  25.     //set方法  
  26.     public void setUserDao(UserDao userDao){  
  27.         this.userDao = userDao;  
  28.     }  
  29.       
  30.     public void addUser(User user){  
  31.         userDao.add(user);  
  32.     }  
  33.       
  34.     @Transactional(readOnly=true)  
  35.     public User findById(Long id){  
  36.         return userDao.findById(id);  
  37.     }  
  38.       
  39.     @Transactional(readOnly=true)  
  40.     public List<User> findAll(){  
  41.         return userDao.findAll();  
  42.     }  
  43. }  
  44. </span></span>  

 



 测试类HibernateTest .java


Java代码  收藏代码
  1. <span style="font-size: large;"><span style="font-size: large;">package com.javacrazyer.service.test;  
  2.   
  3. import org.junit.Test;  
  4. import org.springframework.context.ApplicationContext;  
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  6.   
  7. import com.javacrazyer.domain.User;  
  8. import com.javacrazyer.service.ServiceFacade;  
  9.   
  10.   
  11. public class HibernateTest {  
  12.   
  13.     @Test  
  14.     public void addUser(){  
  15.         ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");  
  16.         ServiceFacade sf = (ServiceFacade)context.getBean("sf");  
  17.         User user = new User();  
  18.         user.setUsername("test1");  
  19.         user.setPwd("test1");  
  20.         sf.addUser(user);  
  21.         System.out.println(user);  
  22.     }  
  23.       
  24.       
  25. }  
  26. </span></span>  

 


  

题外话:

针对第一种方式hibernate.cfg.xml中如果配置了数据库信息的,下面这两个类有必要看下

生成数据库脚本的DBScriptExport .java


Java代码  收藏代码
  1. <span style="font-size: large;"><span style="font-size: large;">package com.javacrazyer.dao;  
  2.   
  3. import java.sql.SQLException;  
  4.   
  5. import org.hibernate.cfg.AnnotationConfiguration;  
  6. import org.hibernate.cfg.Configuration;  
  7. import org.hibernate.tool.hbm2ddl.SchemaExport;  
  8. import org.junit.Test;  
  9.   
  10. /** 
  11.  * 根据对象关系映射文件直接生成数据库表或生成建表的脚本 
  12.  *  
  13.  *  
  14.  */  
  15. public class DBScriptExport {  
  16.     @Test  
  17.     public  void export2DB() {  
  18.         // 加载Hibernate的全局配置文件,config()默认传入src下面的hibernat.cfg.xml配置文件  
  19.         Configuration config = new AnnotationConfiguration().configure();  
  20.         SchemaExport export = new SchemaExport(config);  
  21.         export.create(truetrue);  
  22.     }  
  23.   
  24.     public static void export2File(String dest) {  
  25.   
  26.         Configuration config = new AnnotationConfiguration().configure();  
  27.         SchemaExport export = new SchemaExport(config);  
  28.         export.setOutputFile(dest).setDelimiter(";").setFormat(true).create(  
  29.                 truefalse);  
  30.     }  
  31.   
  32. }  
  33. </span></span>  


用于获取session的 HibernateUtils .java


Java代码  收藏代码
  1. <span style="font-size: large;"><span style="font-size: large;">package com.javacrazyer.dao;  
  2.   
  3. import org.hibernate.Session;  
  4. import org.hibernate.SessionFactory;  
  5. import org.hibernate.cfg.AnnotationConfiguration;  
  6. import org.hibernate.cfg.Configuration;  
  7.   
  8. public class HibernateUtils {  
  9. private static SessionFactory factory;  
  10.       
  11.     private HibernateUtils() {}  
  12.       
  13.     static {  
  14.         Configuration cfg = new AnnotationConfiguration().configure();  
  15.         factory = cfg.buildSessionFactory();  
  16.     }  
  17.       
  18.     public static SessionFactory getSessionFactory() {  
  19.         return factory;  
  20.     }  
  21.       
  22.     public static Session getSession() {  
  23.         return factory.getCurrentSession();  
  24.     }  
  25.       
  26.     public static void closeSession(Session session) {  
  27.         if (session != null) {  
  28.             if (session.isOpen()) {  
  29.                 session.close();  
  30.             }  
  31.         }  
  32.     }  
  33. }  
  34. </span></span>  

 


测试类.java


Java代码  收藏代码
  1. <span style="font-size: large;"><span style="font-size: large;">package com.javacrazyer.service.test;  
  2.   
  3. import org.hibernate.classic.Session;  
  4. import org.junit.Test;  
  5.   
  6. import com.javacrazyer.dao.HibernateUtils;  
  7. import com.javacrazyer.domain.User;  
  8.   
  9.   
  10. public class HibernateTest {  
  11.     @Test  
  12.     public void testAdd(){  
  13.       
  14.         //如果是getCurrentSession得配置一些代码  
  15.         Session session=(Session) HibernateUtils.getSession();  
  16.         User user = new User();  
  17.         user.setUsername("test1");  
  18.         user.setPwd("test1");  
  19.         session.save(user);  
  20.           
  21.     }  
  22.       
  23.       
  24. }  
  25. </span></span>  

 

最后,关于这两种方式,根据个人喜好,我比较爱用第二种

原创粉丝点击