分享

Spring、Hibernate和范型

 shaobin0604@163.com 2006-09-02
      去年6月份开始接触Java,到8,9月份基本掌握Spring,Hibernate,Struts,然后自己搭建了一个框架,并成功的应用到项目上。应该说,从那个时候起,我就开始思考这个问题,这个过程持续了很长的时间。
大概是今年年后,51之前的这一段时间,突然想通了怎么在Spring里面实现范型,大致的实现如下:
public class UserServiceImp  implements  UserService {
        private RootService<T> rootService;
        public setRootService(RootService<T> rootService)
        {
              this.rootService = rootService;
        }
}
applicationContext.xml文件的相关配置
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="configLocation">
   <value>classpath:hibernate.cfg.xml</value>
  </property>
  <property name="mappingDirectoryLocations">
   <list>
    <value>classpath:/com/upup/bean/</value>
   </list>
  </property>
 </bean>
<bean id="rootService" class="com.upup.dao.RootServiceImp">
  <property name="sessionFactory">
   <ref local="sessionFactory" />
  </property>
 </bean>
<bean id="userService" class="com.upup.business.service.UserServiceImp">
  <property name="rootService">
   <ref local="rootService" />
  </property>
 </bean>
 
 
在解决了Spring的范型支持的问题后,开始考虑Hibernate的范型支持的问题,但始终受困于如何在范型类中根据T得到class,因为不能简单的调用T.getClass来获得class,直到昨天看到江南白衣的blog上的那篇文章,终于发现了解决办法,即定义一个范型父类AbstractBaseService,在其中实现基本的CRUD操作,然后UserService继承AbstractBaseService,这样完美的实现了Spring、Hibernate对于范型的支持,可以大量简化开发工作。当然,现在还有个局限,即只能通过继承父类的方法来实现在父类中获得T的class。
相关实现的代码:
UserServiceImp.java
public class UserServiceImp extends AbstractBaseService<User> implements
  UserService {
 public UserServiceImp()
 {
  
  super("User");
 }
@Override
 public User add(User obj) {
  obj = super.add(obj);
  this.getCache().addToCache(obj, this.getGetAllKey(), obj.getId());
  this.getCache().putCountKey(this.getGetAllCountKey());
  return obj;
 }
}
AbstractBaseService.java
public abstract class AbstractBaseService<T>{
 private Class<T> entityClass;
 private Log logger = null;
 private String tableName;
 private RootService<T> rootService;
 private CacheService<T> cache;
 
public void setCache(CacheService<T> cacheService) {
  this.cache = cacheService;
  cache.setEntityClass(entityClass);
  cache.setTableName(tableName);
 }
public AbstractBaseService(String tableName) {
  this.tableName = tableName;
  entityClass = (Class<T>) ((ParameterizedType) getClass()
    .getGenericSuperclass()).getActualTypeArguments()[0];
  logger = LogFactory.getLog(entityClass);
 }
public T findByID(Serializable id) {
  return cache.getObjectFormCacheByID(id.toString());
 }
 
 public T add(T obj)
 {
  try {
   obj = rootService.insertObject(obj);
   
   return obj;
  } catch (DataAccessException ex) {
   logger.error("add(T obj):", ex.getCause());
   return null;
  }
 }
 
 public T save(T obj) {
  try {
   rootService.saveObject(obj);
   return obj;
  } catch (DataAccessException ex) {
   logger.error("save(T obj):" + ex);
   return null;
  }
 }
 
 public void delete(T obj)
 {
  rootService.deleteObject(obj);
 }
}
以上代码也考虑对缓存的支持,关于缓存的实现,留待下次专门讨论。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多