hibernate使用annotation进行持久化操作(一)

公司中一直使用的都是ibatis,因其简单,灵活,容易进行调优等。最近由于项目需要使用到了hibernate,我们的项目中DO对象非常多,如果使用ibatis或者hibernate xml配置的话会非常烦琐,有太多的重复劳动,结合考虑了下,决定使用hibernate annotation来实现。下面是hibernation持久化的泛型Dao接口及实现类,网上有很多,这里粘贴上来,是为了文章的完整性。

1. interface MetrixGenericDao.java

  
  
  
  
  1. package com.alibaba.corp.metrix.admin.biz.edi.dao.generic; 
  2.  
  3. /** 
  4.  * Copyright 1999-2100 Alibaba.com All right reserved. This software is the 
  5.  * confidential and proprietary information of Alibaba.com 
  6.  * ("Confidential Information"). You shall not disclose such Confidential 
  7.  * Information and shall use it only in accordance with the terms of the license 
  8.  * agreement you entered into with Alibaba.com. 
  9.  * 
  10.  * @Author: leon Mao 
  11.  * @Date: 06/03/2012 
  12.  * @Time: 16:08 
  13.  * @Description: //TODO 
  14.  */ 
  15.  
  16. import java.util.List; 
  17. import java.util.Map; 
  18.  
  19. /** 
  20.  * * 
  21.  * 
  22.  * @param <T> 泛型,指实体类 type 
  23.  * @param <PK> 泛型,指实体类主键的数据类型,如Integer,Long 
  24.  */ 
  25. public interface MetrixGenericDao<T,PK> { 
  26.  
  27.     /** 
  28.      * 保存指定实体类 
  29.      * 
  30.      * @param entity 实体类 
  31.      */ 
  32.     public PK save(T entity); 
  33.  
  34.     /** 
  35.      * batch insert 
  36.      * @param entities 
  37.      */ 
  38.     public void batchInsert(List<T> entities); 
  39.  
  40.     /** 
  41.      * 删除指定实体 
  42.      *  
  43.      * @param entity 实体类 
  44.      */ 
  45.     public void delete(T entity); 
  46.  
  47.     /** 
  48.      * * 删除实体 
  49.      *  
  50.      * @param entityClass 实体类名 
  51.      * @param id 实体的ID 
  52.      */ 
  53.     public void deleteById(Class<T> entityClass, PK id); 
  54.  
  55.     /** 
  56.      * 更新或保存指定实体 
  57.      *  
  58.      * @param entity 实体类 
  59.      */ 
  60.     public void saveorupdate(T entity); 
  61.  
  62.     /** 
  63.      * * 更新实体 可用于添加、修改、删除操作 
  64.      *  
  65.      * @param hql 更新的HQL语句 
  66.      * @param params 参数,可有项目或多项目,代替Hql中的"?"号 
  67.      */ 
  68.     public void update(String hql, Map<String,Object> params); 
  69.  
  70.     /** 
  71.      * @param entity 条件实体 
  72.      * @return 结合 
  73.      */ 
  74.     public List<T> findByExample(T entity); 
  75.  
  76.     /** 
  77.      * 获取所有实体集合 
  78.      *  
  79.      * @param entityClass 实体 
  80.      * @return 集合 
  81.      */ 
  82.     public List<T> findAll(Class<T> entityClass); 
  83.  
  84.     public List<T> findAll(Class entityClass, String hql, Map<String,Object> params, int start, int limit); 
  85.  
  86.     /** 
  87.      * 查找指定PK实体类对象 
  88.      *  
  89.      * @param entityClass 实体Class 
  90.      * @param id 实体PK 
  91.      * @return 实体对象 
  92.      */ 
  93.     public T findById(Class<T> entityClass, PK id); 
  94.  
  95.     /** 
  96.      * * 按HQL条件查询列表 
  97.      *  
  98.      * @param hql 查询语句,支持连接查询和多条件查询 
  99.      * @param params 参数数组,代替hql中的"?"号 
  100.      * @return 结果集List 
  101.      */ 
  102.     public List<T> findByHql(String hql, Map<String,Object> params); 
  103.  
  104.     /** 
  105.      * 查找指定属性的实体集合 
  106.      *  
  107.      * @param entityClass 实体 
  108.      * @param propertyName 属性名 
  109.      * @param value 条件 
  110.      * @return 实体集合 
  111.      */ 
  112.     public List<T> findByProperty(Class<T> entityClass, String propertyName, Object value); 
  113.  
  114.     /** 
  115.      * 获得总记录数 
  116.      */ 
  117.     public Integer getTotalCount(Class<T> entityClass); 
  118.  

 2. implement MetrixGenericDaoImpl

  
  
  
  
  1. package com.alibaba.corp.metrix.admin.biz.edi.dao.generic; 
  2.  
  3. import java.io.Serializable; 
  4. import java.sql.SQLException; 
  5. import java.util.List; 
  6. import java.util.Map; 
  7.  
  8. import org.hibernate.HibernateException; 
  9. import org.hibernate.Query; 
  10. import org.hibernate.Session; 
  11. import org.hibernate.SessionFactory; 
  12. import org.slf4j.Logger; 
  13. import org.slf4j.LoggerFactory; 
  14. import org.springframework.orm.hibernate3.HibernateCallback; 
  15. import org.springframework.orm.hibernate3.support.HibernateDaoSupport; 
  16. import org.springframework.stereotype.Repository; 
  17.  
  18. import com.alibaba.corp.metrix.admin.biz.dataprocess.job.base.BeanFactoryUtil; 
  19.  
  20. /** 
  21.  * Copyright 1999-2100 Alibaba.com All right reserved. This software is the 
  22.  * confidential and proprietary information of Alibaba.com 
  23.  * ("Confidential Information"). You shall not disclose such Confidential 
  24.  * Information and shall use it only in accordance with the terms of the license 
  25.  * agreement you entered into with Alibaba.com. 
  26.  *  
  27.  * @Author: leon Mao 
  28.  * @Date: 06/03/2012 
  29.  * @Time: 16:23 
  30.  * @Description: //TODO 
  31.  */ 
  32. @SuppressWarnings("unchecked"
  33. @Repository("genericDao"
  34. //声明此类为数据持久层的类 
  35. public class MetrixGenericDaoImpl<T, PK extends Serializable> extends HibernateDaoSupport implements 
  36.         MetrixGenericDao<T, PK> { 
  37.     private static Logger logger = LoggerFactory.getLogger(MetrixGenericDaoImpl.class); 
  38.  
  39.     public MetrixGenericDaoImpl() { 
  40.         setSessionFactory((SessionFactory) BeanFactoryUtil.getBean("sessionFactory")); 
  41.     } 
  42.  
  43.     public PK save(T entity) { 
  44.         return (PK) super.getHibernateTemplate().save(entity); 
  45.     } 
  46.  
  47.     public void batchInsert(final List<T> entities) { 
  48.         super.getHibernateTemplate().execute(new HibernateCallback() { 
  49.             public Object doInHibernate(Session session) throws HibernateException, SQLException { 
  50.                 for (T entity : entities) { 
  51.                     try { 
  52.                         session.save(entity); 
  53.                     } catch (Exception e) { 
  54.                         if (logger.isWarnEnabled()) { 
  55.                             logger.warn("Session Save Error: ", e); 
  56.                         } 
  57.                         session.update(entity); 
  58.                     } 
  59.                 } 
  60.                 return entities.size(); 
  61.             } 
  62.         }); 
  63.     } 
  64.  
  65.     public void delete(T entity) { 
  66.         super.getHibernateTemplate().delete(entity); 
  67.     } 
  68.  
  69.     public void deleteById(Class<T> entityClass, PK id) { 
  70.         super.getHibernateTemplate().delete(findById(entityClass, id)); 
  71.     } 
  72.  
  73.     public void saveorupdate(T entity) { 
  74.         super.getHibernateTemplate().saveOrUpdate(entity); 
  75.     } 
  76.  
  77.     public void update(String hql, Map<String, Object> params) { 
  78.         Query query = super.getSession().createQuery(hql); 
  79.         if (params != null && params.size() > 0) { 
  80.             for (String key : params.keySet()) { 
  81.                 query.setParameter(key, params.get(key)); 
  82.             } 
  83.         } 
  84.         query.executeUpdate(); 
  85.     } 
  86.  
  87.     public List<T> findAll(Class<T> entityClass) { 
  88.         return super.getHibernateTemplate().loadAll(entityClass); 
  89.     } 
  90.  
  91.     public List<T> findAll(Class entityClass, String hql, Map<String, Object> params, int start, 
  92.                            int limit) { 
  93.         Query query = super.getSession().createQuery(hql); 
  94.         if (params != null && params.size() > 0) { 
  95.             for (String key : params.keySet()) { 
  96.                 query.setParameter(key, params.get(key)); 
  97.             } 
  98.         } 
  99.         if (start != 0 && limit != 0) { 
  100.             query.setFirstResult(start).setMaxResults(limit); 
  101.         } 
  102.         return query.list(); 
  103.     } 
  104.  
  105.     public List<T> findByExample(T entity) { 
  106.         return super.getHibernateTemplate().findByExample(entity); 
  107.     } 
  108.  
  109.     public List<T> findByHql(String hql, Map<String, Object> params) { 
  110.         Query query = super.getSession().createQuery(hql); 
  111.         if (null != params && params.size() > 0) { 
  112.             for (String key : params.keySet()) { 
  113.                 query.setParameter(key, params.get(key)); 
  114.             } 
  115.         } 
  116.         return query.list(); 
  117.     } 
  118.  
  119.     public T findById(Class<T> entityClass, PK id) { 
  120.         return (T) super.getHibernateTemplate().get(entityClass, id); 
  121.     } 
  122.  
  123.  
  124.     public Integer getTotalCount(Class entityClass) { 
  125.         return getSession().createQuery("from " + entityClass.getSimpleName()).list().size(); 
  126.     } 
  127.  
  128.     public List<T> findByProperty(Class<T> entityClass, String propertyName, Object value) { 
  129.         String queryString = "from " + entityClass.getName() + " as model where model." 
  130.                 + propertyName + "=?"
  131.         return super.getHibernateTemplate().find(queryString, value); 
  132.     } 

3. spring配置

  
  
  
  
  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:context="http://www.springframework.org/schema/context" 
  5.        xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 
  6.        xsi:schemaLocation=" 
  7.             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
  8.             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd 
  9.             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
  10.             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> 
  11.  
  12.     <bean id="propertyConfigurer_metrix_service" 
  13.           class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
  14.         <property name="order" value="1"/> 
  15.         <property name="ignoreUnresolvablePlaceholders" value="true"/> 
  16.         <property name="locations"> 
  17.             <list> 
  18.                 <value>classpath*:META-INF/metrix-admin.properties</value> 
  19.             </list> 
  20.         </property> 
  21.     </bean> 
  22.  
  23.     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
  24.         <property name="driverClassName" value="${metrix.jdbc.driverClassName}"/> 
  25.         <property name="url" value="${metrix.jdbc.url}"/> 
  26.         <property name="username" value="${metrix.jdbc.username}"/> 
  27.         <property name="password" value="${metrix.jdbc.password}"/> 
  28.         <property name="maxActive" value="10"/> 
  29.         <property name="maxIdle" value="5"/> 
  30.         <property name="minIdle" value="1"/> 
  31.     </bean> 
  32.     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
  33.         <property name="dataSource" ref="dataSource"/> 
  34.         <property name="annotatedClasses"> 
  35.             <list> 
  36.                 <value>com.alibaba.corp.metrix.admin.biz.edi.model.domain.taobao.SecurityFlaw</value> 
  37.                 ...
  38.             </list> 
  39.         </property> 
  40.         <property name="annotatedPackages"> 
  41.             <list> 
  42.                 <value>com.alibaba.corp.metrix.admin.biz.dataprocess.model.domain</value> 
  43.             </list> 
  44.         </property> 
  45.         <property name="hibernateProperties"> 
  46.             <props> 
  47.                 <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop> 
  48.                 <prop key="hibernate.connection.autocommit">true</prop> 
  49.                 <prop key="hibernate.show_sql">true</prop> 
  50.                 <prop key="hibernate.jdbc.batch_size">50</prop> 
  51.                 <prop key="hibernate.jdbc.fetch_size">50</prop> 
  52.             </props> 
  53.         </property> 
  54.     </bean> 
  55.  
  56.     <!-- Dao beans --> 
  57.     <!-- <bean id="sqlDaoBaseSupport" abstract="true"> 
  58.      <property name="sessionFactory" ref="sessionFactory" /> 
  59.     </bean> 
  60.     <bean id="securityFlawDao" class="com.alibaba.corp.metrix.admin.biz.edi.dao.SecurityFlawDao" parent="sqlDaoBaseSupport"/>--> 
  61.  
  62.     <bean id="metaManager" class="com.alibaba.corp.metrix.admin.biz.edi.meta.MetaManager" init-method="init"/> 
  63.  
  64.      <bean id="metrixJobInitializer" class="com.alibaba.corp.metrix.admin.biz.dataprocess.job.base.MetrixJobInitializer" init-method="init"/> 
  65.  
  66.     <!-- dao beans --> 
  67.     <bean id="securityFlawDao" class="com.alibaba.corp.metrix.admin.biz.edi.meta.MetrixDaoFactoryBean"> 
  68.         <property name="daoName" value="securityFlawDao"/> 
  69.     </bean> 
  70.     <bean id="ifreeAvailableResourceDao" class="com.alibaba.corp.metrix.admin.biz.edi.meta.MetrixDaoFactoryBean"> 
  71.         <property name="daoName" value="ifreeAvailableResourceDao"/> 
  72.     </bean> 
  73.  
  74.  
  75.     <!-- Service beans --> 
  76.     <bean id="urlRawDataAccessService" class="com.alibaba.corp.metrix.admin.biz.edi.services.UrlRawDataAccessService" 
  77.           init-method="init"> 
  78.         <property name="rawDataStoreDir" value="${metrix.url.rawdata.store.dir}"/> 
  79.     </bean> 
  80.  
  81.     <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
  82.         <property name="sessionFactory"> 
  83.             <ref local="sessionFactory"/> 
  84.         </property> 
  85.     </bean> 
  86.  
  87.     <bean id="transactionInterceptor" 
  88.           class="org.springframework.transaction.interceptor.TransactionInterceptor"> 
  89.         <property name="transactionManager" ref="transactionManager"/> 
  90.         <property name="transactionAttributes"> 
  91.             <props> 
  92.                 <prop key="save*">PROPAGATION_REQUIRED,-Exception</prop> 
  93.                 <prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop> 
  94.                 <prop key="batchInsert*">PROPAGATION_REQUIRED,-Exception</prop> 
  95.                 <prop key="update*">PROPAGATION_REQUIRED,-Exception</prop> 
  96.                 <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> 
  97.             </props> 
  98.         </property> 
  99.     </bean> 
  100.  
  101.     <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 
  102.         <property name="beanNames"> 
  103.             <list> 
  104.                 <value>*Dao</value> 
  105.             </list> 
  106.         </property> 
  107.         <property name="interceptorNames"> 
  108.             <list> 
  109.                 <value>transactionInterceptor</value> 
  110.             </list> 
  111.         </property> 
  112.     </bean> 
  113.  
  114. </beans> 

4. 由于java在编译期进行了类型擦除,当前我们的业务逻辑中可以直接调用Dao接口,但spring不支持泛型Dao配置,这里做了点猥琐的事情,继承spring的FactoryBean,通过这个类将Dao注入到spring中,并对Dao接口进行了事务配置

  
  
  
  
  1. package com.alibaba.corp.metrix.admin.biz.edi.meta; 
  2.  
  3. import java.util.HashMap; 
  4. import java.util.List; 
  5. import java.util.Map; 
  6.  
  7. import org.springframework.beans.factory.FactoryBean; 
  8.  
  9. import com.alibaba.corp.metrix.admin.biz.dataprocess.job.base.DefaultMetrixJob; 
  10. import com.alibaba.corp.metrix.admin.biz.edi.dao.generic.MetrixGenericDao; 
  11. import com.alibaba.corp.metrix.admin.biz.edi.dao.generic.MetrixGenericDaoImpl; 
  12. import com.alibaba.corp.metrix.admin.biz.edi.model.domain.taobao.*; 
  13.  
  14. public class MetrixDaoFactoryBean implements FactoryBean { 
  15.     private String                                                 daoName; 
  16.  
  17.     private static Map<String, MetrixGenericDaoImpl<?, ?>>         daoContainer = new HashMap<String, MetrixGenericDaoImpl<?, ?>>(); 
  18.  
  19.     // 用于扩展特殊的保存逻辑 
  20.     private static Map<String, DefaultMetrixJob.DomainObjectSaver> savers       = new HashMap<String, DefaultMetrixJob.DomainObjectSaver>(); 
  21.  
  22.     static { 
  23.         // 初始化特定的Dao 
  24.         daoContainer.put("securityFlawDao"new MetrixGenericDaoImpl<SecurityFlaw, String>()); 
  25.         daoContainer.put("ifreeAvailableResourceDao"
  26.                 new MetrixGenericDaoImpl<IfreeAvailableResource, String>()); 
  27.         daoContainer.put("ifreeProjectDao"new MetrixGenericDaoImpl<IfreeProject, String>()); 
  28.         daoContainer.put("ifreeRequirementDao"
  29.                 new MetrixGenericDaoImpl<IfreeRequirement, String>()); 
  30.         daoContainer.put("ifreeOrderDao"new MetrixGenericDaoImpl<IfreeOrder, String>()); 
  31.         daoContainer.put("wfFaultDao"new MetrixGenericDaoImpl<WfFault, String>()); 
  32.     }
  33.  
  34.     public String getDaoName() { 
  35.         return daoName; 
  36.     } 
  37.  
  38.     public void setDaoName(String daoName) { 
  39.         this.daoName = daoName; 
  40.     } 
  41.  
  42.     public Object getObject() throws Exception { 
  43.         if (daoContainer.keySet().contains(daoName)) { 
  44.             return daoContainer.get(daoName); 
  45.         } else { 
  46.             throw new RuntimeException(daoName + " has no corresponding Object!"); 
  47.         } 
  48.     } 
  49.  
  50.     public Class getObjectType() { 
  51.         return MetrixGenericDao.class
  52.     } 
  53.  
  54.     public boolean isSingleton() { 
  55.         return true
  56.     } 
  57.  
  58.     private static MetrixGenericDao getDao(String daoName) { 
  59.         return daoContainer.get(daoName); 
  60.     } 

 

你可能感兴趣的:(Hibernate,annotation,泛型,OneToMany)