`
jiangzhenghua
  • 浏览: 602793 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate的范型基类

阅读更多
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projection;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.impl.CriteriaImpl;
import org.hibernate.transform.ResultTransformer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;
import org.springside.modules.utils.BeanUtils;

/**
 * Hibernate的范型基类.
 * 
 * 可以在service类中直接创建使用.也可以继承出DAO子类,在多个Service类中共享DAO操作.
 * 参考Spring2.5自带的Petlinc例子,取消了HibernateTemplate.
 * 通过Hibernate的sessionFactory.getCurrentSession()获得session,直接使用Hibernate原生API.
 *
 * @param <T> DAO操作的对象类型
 * @param <PK> 主键类型
 * 
 * @author calvin
 */
@SuppressWarnings("unchecked")
public class SimpleHibernateTemplate<T, PK extends Serializable> {

    protected Logger logger = LoggerFactory.getLogger(getClass());

    protected SessionFactory sessionFactory;

    protected Class<T> entityClass;

    public SimpleHibernateTemplate(SessionFactory sessionFactory, Class<T> entityClass) {
        this.sessionFactory = sessionFactory;
        this.entityClass = entityClass;
    }

    public Session getSession() {
        return sessionFactory.getCurrentSession();
    }

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public void save(T entity) {
        Assert.notNull(entity);
        getSession().saveOrUpdate(entity);
        logger.info("save entity: {}", entity);
    }

    public void delete(T entity) {
        Assert.notNull(entity);
        getSession().delete(entity);
        logger.info("delete entity: {}", entity);
    }

    public void delete(PK id) {
        Assert.notNull(id);
        delete(get(id));
    }

    public List<T> findAll() {
        return findByCriteria();
    }

    public Page<T> findAll(Page<T> page) {
        return findByCriteria(page);
    }

    /**
     * 按id获取对象.
     */
    public T get(final PK id) {
        return (T) getSession().load(entityClass, id);
    }

    /**
     * 按HQL查询对象列表.
     * 
     * @param hql hql语句
     * @param values 数量可变的参数
     */
    public List find(String hql, Object values) {
        return createQuery(hql, values).list();
    }

    /**
     * 按HQL分页查询.
     * 暂不支持自动获取总结果数,需用户另行执行查询.
     * 
     * @param page 分页参数.包括pageSize 和firstResult.
     * @param hql hql语句.
     * @param values 数量可变的参数.
     * 
     * @return 分页查询结果,附带结果列表及所有查询时的参数.
     */
    public Page<T> find(Page<T> page, String hql, Object values) {
        Assert.notNull(page);

        if (page.isAutoCount()) {
            logger.warn("HQL查询暂不支持自动获取总结果数,hql为{}", hql);
        }
        Query q = createQuery(hql, values);
        if (page.isFirstSetted()) {
            q.setFirstResult(page.getFirst());
        }
        if (page.isPageSizeSetted()) {
            q.setMaxResults(page.getPageSize());
        }
        page.setResult(q.list());
        return page;
    }

    /**
     * 按HQL查询唯一对象.
     */
    public Object findUnique(String hql, Object values) {
        return createQuery(hql, values).uniqueResult();
    }

    /**
     * 按HQL查询Intger类形结果. 
     */
    public Integer findInt(String hql, Object values) {
        return (Integer) findUnique(hql, values);
    }

    /**
     * 按HQL查询Long类型结果. 
     */
    public Long findLong(String hql, Object values) {
        return (Long) findUnique(hql, values);
    }

    /**
     * 按Criterion查询对象列表.
     * @param criterion 数量可变的Criterion.
     */
    public List<T> findByCriteria(Criterion criterion) {
        return createCriteria(criterion).list();
    }

    /**
     * 按Criterion分页查询.
     * @param page 分页参数.包括pageSize、firstResult、orderBy、asc、autoCount.
     *             其中firstResult可直接指定,也可以指定pageNo.
     *             autoCount指定是否动态获取总结果数.
     *             
     * @param criterion 数量可变的Criterion.
     * @return 分页查询结果.附带结果列表及所有查询时的参数.
     */
    public Page<T> findByCriteria(Page page, Criterion criterion) {
        Assert.notNull(page);

        Criteria c = createCriteria(criterion);

        if (page.isAutoCount()) {
            page.setTotalCount(countQueryResult(page, c));
        }
        if (page.isFirstSetted()) {
            c.setFirstResult(page.getFirst());
        }
        if (page.isPageSizeSetted()) {
            c.setMaxResults(page.getPageSize());
        }

        if (page.isOrderBySetted()) {
            if (page.getOrder().endsWith(QueryParameter.ASC)) {
                c.addOrder(Order.asc(page.getOrderBy()));
            } else {
                c.addOrder(Order.desc(page.getOrderBy()));
            }
        }
        page.setResult(c.list());
        return page;
    }

    /**
     * 按属性查找对象列表.
     */
    public List<T> findByProperty(String propertyName, Object value) {
        Assert.hasText(propertyName);
        return createCriteria(Restrictions.eq(propertyName, value)).list();
    }

    /**
     * 按属性查找唯一对象.
     */
    public T findUniqueByProperty(String propertyName, Object value) {
        Assert.hasText(propertyName);
        return (T) createCriteria(Restrictions.eq(propertyName, value)).uniqueResult();
    }

    /**
     * 根据查询函数与参数列表创建Query对象,后续可进行更多处理,辅助函数.
     */
    public Query createQuery(String queryString, Object values) {
        Assert.hasText(queryString);
        Query queryObject = getSession().createQuery(queryString);
        if (values != null) {
            for (int i = 0; i < values.length; i++) {
                queryObject.setParameter(i, values[i]);
            }
        }
        return queryObject;
    }

    /**
     * 根据Criterion条件创建Criteria,后续可进行更多处理,辅助函数.
     */
    public Criteria createCriteria(Criterion criterions) {
        Criteria criteria = getSession().createCriteria(entityClass);
        for (Criterion c : criterions) {
            criteria.add(c);
        }
        return criteria;
    }

    /**
     * 判断对象的属性值在数据库内是否唯一.
     * 
     * 在修改对象的情景下,如果属性新修改的值(value)等于属性原值(orgValue)则不作比较.
     * 传回orgValue的设计侧重于从页面上发出Ajax判断请求的场景.
     * 否则需要SS2里那种以对象ID作为第3个参数的isUnique函数.
     */
    public boolean isPropertyUnique(String propertyName, Object newValue, Object orgValue) {
        if (newValue == null || newValue.equals(orgValue))
            return true;

        Object object = findUniqueByProperty(propertyName, newValue);
        return (object == null);
    }

    /**
     * 通过count查询获得本次查询所能获得的对象总数.
     * @return page对象中的totalCount属性将赋值.
     */
    protected int countQueryResult(Page<T> page, Criteria c) {
        CriteriaImpl impl = (CriteriaImpl) c;

        // 先把Projection、ResultTransformer、OrderBy取出来,清空三者后再执行Count操作
        Projection projection = impl.getProjection();
        ResultTransformer transformer = impl.getResultTransformer();

        List<CriteriaImpl.OrderEntry> orderEntries = null;
        try {
            orderEntries = (List) BeanUtils.getFieldValue(impl, "orderEntries");
            BeanUtils.setFieldValue(impl, "orderEntries", new ArrayList());
        } catch (Exception e) {
            logger.error("不可能抛出的异常:{}", e.getMessage());
        }

        // 执行Count查询
        int totalCount = (Integer) c.setProjection(Projections.rowCount()).uniqueResult();
        if (totalCount < 1)
            return -1;

        // 将之前的Projection和OrderBy条件重新设回去
        c.setProjection(projection);

        if (projection == null) {
            c.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
        }
        if (transformer != null) {
            c.setResultTransformer(transformer);
        }

        try {
            BeanUtils.setFieldValue(impl, "orderEntries", orderEntries);
        } catch (Exception e) {
            logger.error("不可能抛出的异常:{}", e.getMessage());
        }

        return totalCount;
    }
}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wuyashuan/archive/2009/04/27/4130406.aspx

 

分享到:
评论

相关推荐

    Hibernate_范型_级联

    【标题】:Hibernate_范型_级联 在Java编程中,Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发人员将数据库操作转换为面向对象的方式,从而简化了数据库应用的开发。范型(Generics)是Java 5引入的一...

    C++多范型设计

    《C++多范型设计》是一本深入探讨C++编程语言中模板技术的专著,由知名软件工程师James O. Coplien撰写,并由鄢爱兰、周辉等翻译成中文版,ISBN号为9787508318240。这本书的核心主题是C++中的泛型编程,它是C++编程...

    论文研究-消息传递范型与C/S范型双范型的主数据管理机制 .pdf

    本文提出的基于消息传递范型和客户机/服务器(Client/Server,简称C/S)范型双范型的主数据管理机制,能够有效解决MDM面临的问题。 消息传递范型是计算机科学中的一个基本概念,用于描述进程间通信的方式。在这范型...

    范型程序设计与 STL.pdf

    《范型程序设计与 STL》是一本深入探讨C++编程中的关键概念和技术的书籍,主要聚焦于范型(Generic Programming)和标准模板库(Standard Template Library,简称STL)。范型编程是一种强大的软件开发方法,它允许...

    《分布式系统原理与范型》.pdf

    《分布式系统原理与范型》作为一本系统介绍分布式系统基本原理与实践应用的书籍,涵盖了分布式系统设计与实现的核心理念。分布式系统指的是由多个可以独立运行的计算单元构成的系统,这些计算单元通过通信网络相互...

    Java 范型Java 范型.doc

    Java 范型Java 范型

    分布式系统原理与范型

    《分布式系统原理与范型》是分布式系统中的经典教材,全书分为两部分:原理和范型。第一部分详细讨论了分布式系统的原理、概念和技术,其中包括通信、进程、命名、同步、一致性和复制、容错以及安全。第二部分给出了...

    C++多范型设计 作者:[美]James O.Coplien

    书名:C++多范型设计 作者:[美]James O.Coplien 译者: 出版社:中国电力出版社 本书详细地介绍了从“应用领域”到“方案领域”的C++设计实现方法,以及开发者在设计思考和设计实践过程中需要用到的记法、图表和设计...

    分布式系统原理与范型(第二版)

    分布式系统原理与范型是IT领域中至关重要的一个主题,特别是在云计算、大数据处理以及现代互联网服务的背景下,理解和掌握分布式系统的概念与实践至关重要。本书作为第二版,深度探讨了这一领域的核心理论和常见模式...

    分布式系统原理与范型答案(第二版)答案

    分布式系统原理与范型是计算机科学中的一个重要领域,它涵盖了多台计算机如何通过网络协同工作,以实现一个共同的目标。《分布式系统原理与范型(第二版)》这本书深入浅出地介绍了这一主题,旨在帮助读者理解分布式...

    分布式系统-原理与范型(第2版) 完整版

    第2~9章讨论的是分布式系统的的原理、概念和技术,包括通信、进程、命名、同步化、一致性和复制、容错性以及安全性等,而分布式应用的开发方法(即范型)在第10~13章中进行了讨论。但是,与前一版不同的是,我们...

    C++多范型设计.pdf

    C++多范型设计.pdfC++多范型设计.pdfC++多范型设计.pdf

    分布式系统-原理与范型(第2版)

    分布式系统-原理与范型(第2版) 分布式系统-原理与范型(第2版) 分布式系统-原理与范型(第2版) 分布式系统-原理与范型(第2版)

    C++ 多范型设计

    6. 模板的继承与多态:模板类可以作为基类,派生出其他模板类或非模板类。这种继承结合多态,可以构建出复杂的面向对象设计。 7. 跟进C++11及更高版本的特性,如模板别名、右值引用、完美转发等,进一步增强了多...

    Java 范型攻略篇

    ### Java范型攻略篇:深度解析与应用 #### 一、引言:Java范型的引入 在Java的发展历程中,范型(Generics)的引入标志着语言设计上的一个重要里程碑。自Java 1.5发布以来,范型成为了Java语言的重要特性之一,极...

    分布式系统原理与范型第二版课后习题答案

    分布式系统是一种由多台计算机组成的网络系统,这些计算机在用户看来就像是一个单一的系统。它们通过网络互相通信和协调工作,...通过理解分布式系统原理与范型,可以更好地设计和部署高效、可靠、可维护的分布式应用。

    分布式系统原理与范型.pdf

    Tanenbaum教授是早期操作系统领域的知名学者,其著作深入浅出地介绍了分布式系统的基本原理和实现范型。 分布式系统的原理部分是该书的核心内容,涵盖了多个重要的概念和原理。首先,通信是分布式系统中最为基本的...

    《分布式系统原理与范型(第二版)》复习资料

    分布式系统原理与范型是计算机科学领域的一个重要研究方向,它涉及如何构建和管理由多个独立计算机组成的系统,这些系统能够协调工作,对外表现得就像单一的、协调一致的系统一样。在分布式系统中,透明性、开放性、...

    分布式系统原理与范型_考试_2009_答案

    华中科技大学 分布式系统原理与范型_考试_2009_答案

Global site tag (gtag.js) - Google Analytics