Spring整合Hibernate
Posted 云中之歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring整合Hibernate相关的知识,希望对你有一定的参考价值。
如果要用Spring整合 Hibernate,只需要在Spring容器中配置好SessionFactory,如果同需要加入事务控制,只需要配置好相应的事务管理器即可。
下面是一个Spring中的Hibernate的SessionFactory配置,
1 <?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" 4 xmlns:p="http://www.springframework.org/schema/p" 5 xmlns:cache="http://www.springframework.org/schema/cache" 6 xmlns:context="http://www.springframework.org/schema/context" 7 xsi:schemaLocation="http://www.springframework.org/schema/beans 8 http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 9 http://www.springframework.org/schema/cache 10 http://www.springframework.org/schema/cache/spring-cache-4.0.xsd 11 http://www.springframework.org/schema/context 12 http://www.springframework.org/schema/context/spring-context-4.0.xsd"> 13 <!-- 定义数据源Bean,使用C3P0数据源实现,并注入数据源的必要信息 --> 14 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" 15 destroy-method="close" 16 p:driverClass="com.mysql.jdbc.Driver" 17 p:jdbcUrl="jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=UTF-8" 18 p:user="root" 19 p:password="" 20 p:maxPoolSize="40" 21 p:minPoolSize="2" 22 p:initialPoolSize="2" 23 p:maxIdleTime="30" /> 24 <!-- 定义Hibernate的SessionFactory, SessionFactory需要依赖数据源,注入dataSource --> 25 <bean id="sessionFactory" 26 class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" 27 p:dataSource-ref="dataSource"> 28 <!-- annotatedClasses用来列出全部持久化类 --> 29 <property name="annotatedClasses"> 30 <list> 31 <!-- 以下用来列出所有PO类 --> 32 <value>com.entity.Book</value> 33 </list> 34 </property> 35 <!-- 定义Hibernate的sessionFactory属性 --> 36 <property name="hibernateProperties"> 37 <props> 38 <!-- 指定Hibernate的连接方言 --> 39 <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> 40 <!-- 是否根据Hibernate映射表创建数据表 --> 41 <prop key="hibernate.hbm2ddl.auto">update</prop> 42 </props> 43 </property> 44 </bean> 45 <!-- 配置Hibernate的局部数据管理器,使用HibernateTransactionManager类 --> 46 <!-- 该类是PlatformTransactionManager接口针对Hibernate的特定实现 --> 47 <!-- 配置HibernateTransactionManager需要注入sessionFactory --> 48 <bean id="transactionManager" 49 class="org.springframework.orm.hibernate4.HibernateTransactionManager" 50 p:sessionFactory-ref="sessionFactory" /> 51 </beans>
实现DAO组件的基类,通常会面向接口编程,因此定义一下接口,
1 public interface BaseDao<T> { 2 //根据ID加载实体 3 T get(Class<T> entityClazz, Serializable id); 4 //保存实体 5 Serializable save(T entity); 6 //更新实体 7 void update(T entity); 8 //删除实体 9 void delete(T entity); 10 //根据ID删除实体 11 void delete(Class<T> entityClazz, Serializable id); 12 //获取所有实体 13 List<T> finaAll(Class<T> entityClazz); 14 //获取实体总数 15 long findCount(Class<T> entityClazz); 16 }
一个实现类,
1 public class BaseDaoHibernate4<T> implements BaseDao<T> { 2 //DAO组件进行持久化操作底层依赖的SessionFactory组件,将在XML文件中进行依赖注入 3 private SessionFactory sessionFactory; 4 5 public SessionFactory getSessionFactory() { 6 return sessionFactory; 7 } 8 9 public void setSessionFactory(SessionFactory sessionFactory) { 10 this.sessionFactory = sessionFactory; 11 } 12 @Override 13 public T get(Class entityClazz, Serializable id) { 14 return (T)getSessionFactory().getCurrentSession().get(entityClazz, id); 15 } 16 17 @Override 18 public Serializable save(T entity) { 19 return getSessionFactory().getCurrentSession().save(entity); 20 } 21 22 @Override 23 public void update(T entity) { 24 getSessionFactory().getCurrentSession().saveOrUpdate(entity); 25 } 26 27 @Override 28 public void delete(Object entity) { 29 getSessionFactory().getCurrentSession().delete(entity); 30 } 31 32 //根据ID来删除 33 @Override 34 public void delete(Class entityClazz, Serializable id) { 35 getSessionFactory().getCurrentSession().createQuery("delete" + entityClazz.getSimpleName() 36 + " en where en.id = ?0") 37 .setParameter("0" , id) 38 .executeUpdate(); 39 } 40 41 @Override 42 public List finaAll(Class entityClazz) { 43 return find("select en from " + entityClazz.getSimpleName() + " en"); 44 45 } 46 47 @SuppressWarnings("unchecked") 48 protected List<T> find(String hql) { 49 return (List<T>)getSessionFactory().getCurrentSession().createQuery(hql).list(); 50 } 51 52 @SuppressWarnings("unchecked") 53 protected List<T> find(String hql, Object... params) { 54 Query query = getSessionFactory().getCurrentSession().createQuery(hql); 55 for (int i = 0, len = params.length; i < len ; i++) { 56 query.setParameter(i + "", params[i]); 57 } 58 return (List<T>)query.list(); 59 } 60 61 /** 62 * 使用HQL进行分页查询 63 * @param hql HQL语句 64 * @param pageNo 查询第pageNo页的记录 65 * @param pageSize 每页显示页显示的记录数 66 * @return 返回当前页的所有记录 67 */ 68 @SuppressWarnings("unchecked") 69 protected List<T> findByPage(String hql, int pageNo, int pageSize) { 70 return getSessionFactory().getCurrentSession().createQuery(hql) 71 .setFirstResult((pageNo -1) * pageSize) 72 .setMaxResults(pageSize) 73 .list(); 74 } 75 76 /** 77 * 使用HQL进行分页查询 78 * @param hql HQL语句 79 * @param pageNo 查询第pageNo页的记录 80 * @param pageSize 每页显示页显示的记录数 81 * @param params 如果hql带占位符,params用于传入占位符参数 82 * @return 返回当前页的所有记录 83 */ 84 @SuppressWarnings("unchecked") 85 protected List<T> findByPage(String hql, int pageNo, int pageSize, Object... params) { 86 Query query = getSessionFactory().getCurrentSession().createQuery(hql); 87 for (int i = 0, len = params.length ; i < len ; i++) { 88 query.setParameter(i + "" , params[i]); 89 } 90 return query.setFirstResult((pageNo - 1) * pageSize) 91 .setMaxResults(pageSize) 92 .list(); 93 } 94 @Override 95 public long findCount(Class entityClazz) { 96 // TODO Auto-generated method stub 97 return 0; 98 } 99 }
是的范德萨
以上是关于Spring整合Hibernate的主要内容,如果未能解决你的问题,请参考以下文章
spring mvc+spring + hibernate 整合
10.Spring整合Hibernate_3_HibernateTemplate
Spring 整合 Hibernate 时启用二级缓存实例详解