Java tutorial
/** * Copyright (c) 2005-2010 springside.org.cn * * Licensed under the Apache License, Version 2.0 (the "License"); * * $Id: SimpleHibernateDao.java 1205 2010-09-09 15:12:17Z calvinxiu $ */ package com.ghy.common.orm.hibernate; import java.io.Serializable; import java.util.Collection; import java.util.List; import java.util.Map; import org.hibernate.Criteria; import org.hibernate.Hibernate; import org.hibernate.Query; import org.hibernate.SQLQuery; 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.Restrictions; import org.hibernate.metadata.ClassMetadata; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.Assert; import com.ghy.common.util.reflection.ReflectionUtils; /** * ?HibernateAPIDAO. * * ?Service, ?DAO?, ?. ?Spring2.5Petlinc?, * ?HibernateTemplate, HibernateAPI. * * @param <T> * DAO? * @param <PK> * * * @author calvin */ @SuppressWarnings("unchecked") public class SimpleHibernateDao<T, PK extends Serializable> { protected Logger logger = LoggerFactory.getLogger(getClass()); protected SessionFactory sessionFactory; protected Class<T> entityClass; /** * Dao?. ??Class. eg. public class UserDao extends * SimpleHibernateDao<User, Long> */ public SimpleHibernateDao() { this.entityClass = (Class<T>) ReflectionUtils.getSuperClassGenricType(getClass()); } /** * ?Dao, ServiceSimpleHibernateDao. Class. * eg. SimpleHibernateDao<User, Long> userDao = new SimpleHibernateDao<User, * Long>(sessionFactory, User.class); */ public SimpleHibernateDao(final SessionFactory sessionFactory, final Class<T> entityClass) { this.sessionFactory = sessionFactory; this.entityClass = entityClass; } /** * ?sessionFactory. */ public SessionFactory getSessionFactory() { return sessionFactory; } /** * @AutowiredSessionFactory, SesionFactory??. */ @Autowired public void setSessionFactory(final SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } /** * ??Session. */ public Session getSession() { return sessionFactory.getCurrentSession(); } /** * ?. */ public void saveOrUpdate(final T entity) { Assert.notNull(entity, "entity?"); getSession().saveOrUpdate(entity); logger.debug("save entity: {}", entity); } public void update(final T entity) { Assert.notNull(entity, "entity?"); getSession().update(entity); logger.debug("update entity: {}", entity); } public void save(final T entity) { Assert.notNull(entity, "entity?"); getSession().save(entity); logger.debug("saveObj entity: {}", entity); } public void saveAll(final List<T> list) { Assert.notNull(list); getSession().save(list); } /** * . * * @param entity * session?idtransient. */ public void delete(final T entity) { Assert.notNull(entity, "entity?"); getSession().delete(entity); logger.debug("delete entity: {}", entity); } /** * id. */ public void delete(final PK id) { Assert.notNull(id, "id?"); delete(get(id)); logger.debug("delete entity {},id is {}", entityClass.getSimpleName(), id); } /** * id?. */ public T get(final PK id) { // ???NULL?service??<br> // service?????NULL try { Assert.notNull(id, "id?"); } catch (AssertionError e) { return null; } Object o = getSession().get(entityClass, id); return o == null ? null : (T) o; } /** * ???class ??T * @param entity * @param id * @return */ public <X> X get(final Class<X> entity, final PK id) { try { Assert.notNull(id, "id?"); } catch (AssertionError e) { return null; } Object o = getSession().get(entity, id); return o == null ? null : (X) o; } public <X> void release(X entity) { this.getSession().evict(entity); } public <X> Serializable saveX(X entity) { return this.getSession().save(entity); } /** * id?. */ public List<T> get(final Collection<PK> ids) { return find(Restrictions.in(getIdName(), ids)); } /** * ?. */ public List<T> getAll() { return find(); } /** * ?, ??. */ public List<T> getAll(String orderByProperty, boolean isAsc) { Criteria c = createCriteria(); if (isAsc) { c.addOrder(Order.asc(orderByProperty)); } else { c.addOrder(Order.desc(orderByProperty)); } return c.list(); } /** * , ??. */ public List<T> findBy(final String propertyName, final Object value) { Assert.hasText(propertyName, "propertyName?"); Criterion criterion = Restrictions.eq(propertyName, value); return find(criterion); } /** * , ??. */ public T findUniqueBy(final String propertyName, final Object value) { Assert.hasText(propertyName, "propertyName?"); Criterion criterion = Restrictions.eq(propertyName, value); Object object = createCriteria(criterion).uniqueResult(); return object == null ? null : (T) object; } /** * HQL. * * @param values * ????,?. */ public <X> List<X> find(final String hql, final Object... values) { return createQuery(hql, values).list(); } /** * HQL. * * @param values * ???,??. */ public <X> List<X> find(final String hql, final Map<String, ?> values) { return createQuery(hql, values).list(); } /** * HQL. * * @param values * ????,?. */ public <X> X findUnique(final String hql, final Object... values) { return (X) createQuery(hql, values).uniqueResult(); } /** * HQL. * * @param values * ???,??. */ public <X> X findUnique(final String hql, final Map<String, ?> values) { return (X) createQuery(hql, values).uniqueResult(); } /** * HQL?/?. * * @param values * ????,?. * @return . */ public int batchExecute(final String hql, final Object... values) { return createQuery(hql, values).executeUpdate(); } /** * HQL?/?. * * @param values * ???,??. * @return . */ public int batchExecute(final String hql, final Map<String, ?> values) { return createQuery(hql, values).executeUpdate(); } /** * ?HQL?Query. find()???. * * @param values * ????,?. */ public Query createQuery(final String queryString, final Object... values) { Assert.hasText(queryString, "queryString?"); Query query = getSession().createQuery(queryString); if (values != null) { for (int i = 0; i < values.length; i++) { query.setParameter(i, values[i]); } } return query; } /** * ?HQL?Query. find()???. * * @param values * ???,??. */ public Query createQuery(final String queryString, final Map<String, ?> values) { Assert.hasText(queryString, "queryString?"); Query query = getSession().createQuery(queryString); if ((values != null) && (values.size() > 0)) { query.setProperties(values); } return query; } /** * Criteria. * * @param criterions * ???Criterion. */ public List<T> find(final Criterion... criterions) { return createCriteria(criterions).list(); } /** * Criteria. * * @param criterions * ???Criterion. */ public T findUnique(final Criterion... criterions) { return (T) createCriteria(criterions).uniqueResult(); } /** * ?Criterion?Criteria. find()???. * * @param criterions * ???Criterion. */ public Criteria createCriteria(final Criterion... criterions) { Criteria criteria = getSession().createCriteria(entityClass); for (Criterion c : criterions) { criteria.add(c); } return criteria; } /** * ?. load()Proxy, View???. entity, * ??entity,????. ??,: * Hibernate.initialize(user.getRoles())?User??. * Hibernate.initialize(user.getDescription())?UserDescription. */ public void initProxyObject(Object proxy) { Hibernate.initialize(proxy); } /** * Flush?Session. */ public void flush() { getSession().flush(); } /** * Querydistinct transformer. ?HQL??, ?distinct?. */ public Query distinct(Query query) { query.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); return query; } /** * Criteriadistinct transformer. ?HQL??, ?distinct?. */ public Criteria distinct(Criteria criteria) { criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); return criteria; } /** * ???. */ public String getIdName() { ClassMetadata meta = getSessionFactory().getClassMetadata(entityClass); return meta.getIdentifierPropertyName(); } /** * ??. * * ,(value)?(orgValue)?. */ public boolean isPropertyUnique(final String propertyName, final Object newValue, final Object oldValue) { if (newValue == null || newValue.equals(oldValue)) { return true; } Object object = findUniqueBy(propertyName, newValue); return (object == null); } /** * ???Session?<br> * * @author dzh * @date 20110106 * @param t ?? * @return */ public Object merge(T t) { if (t == null) return null; return getSession().merge(t); } /** * ?SQL?SQLQuery. find()???. * * @param values * ???,??. */ public SQLQuery createSqlQuery(final String queryString, final Map<String, ?> values) { Assert.hasText(queryString, "queryString?"); SQLQuery query = getSession().createSQLQuery(queryString); if ((values != null) && (values.size() > 0)) { query.setProperties(values); } return query; } /** * ?SQL?SQLQuery. find()???. * * @param values * ???,??. */ public SQLQuery createSqlQuery(final String queryString, final Map<String, ?> values, final Map<String, ?> values2) { Assert.hasText(queryString, "queryString?"); SQLQuery query = getSession().createSQLQuery(queryString); if ((values != null) && (values.size() > 0)) { query.setProperties(values); } if ((values2 != null) && (values2.size() > 0)) { query.setProperties(values2); } return query; } /** * ?sql??map?list * @param sql * @param params * @return */ public List<Object[]> findBySql(String sql, Map<String, ?> params) { return createSqlQuery(sql, params).list(); } /** * ?sql??map?list * @param sql * @param params * @return */ public List<Object[]> findBySql(String sql, Map<String, ?> params, Map<String, ?> params2) { return createSqlQuery(sql, params, params2).list(); } }