GenericHibernateDAOCrud 【收藏】

public class RegionDAOImpl extends GenericHibernateDAOCrud implements IRegionDAO {
中的GenericHibernateDAOCrud在那裏呀!謝謝了!


GenericHibernateDAOCrud 這個類可以提供給你。它在DAO層對Hibernate增、刪、改、查的基類支持。也就是我文章中提到的DAO模式。
package com.ssgly.dao;

 
import java.io.Serializable;
import java.lang.reflect.Field;
import java.sql.SQLException;
import java.util.*;

import com.ssgly.model.*;

import org.apache.commons.logging.*;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.springframework.dao.DataRetrievalFailureException;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;

/**
 * This base class is prepared for subclass to do CRUD easily.
 * 
 * @author Tiger
 */
public abstract class GenericHibernateDAOCrud<T> {

    protected static final Object[] EMPTY_OBJECT_ARRAY = new Object[] {};

    protected Log log = LogFactory.getLog(getClass());

    private final Class<T> clazz;
    protected HibernateTemplate hibernateTemplate;

    /**
     * Inject domain's class type in constructor.
     * 
     * @param clazz Domain's class.
     */
    public GenericHibernateDAOCrud(Class<T> clazz) {
        this.clazz = clazz;
    }

    /**
     * @spring.property name="hibernateTemplate" ref="hibernateTemplate"
     */
    public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
        this.hibernateTemplate = hibernateTemplate;
    }

    @SuppressWarnings("unchecked")
    public T query(Serializable id) {
        T t = (T)hibernateTemplate.get(clazz, id);
        if(t==null)
            throw new DataRetrievalFailureException("Object not found.");
        // it is strange that load() method return a lazy-loading proxy object 
        // and it may cause LazyInitializationException!
        return t;
    }

    /**
     * Default implementation of creating new domain object.
     */
    public void create(T t) {
        hibernateTemplate.save(t);
    }

    /**
     * Default implementation of deleting new domain object.
     */
    public void delete(T t) {
        hibernateTemplate.delete(t);
    }

    /**
     * Default implementation of updating domain object.
     */
    public void update(T t) {
        hibernateTemplate.update(t);
    }

    /**
     * Do an update hql query, return the affected rows.
     * 
     * @param updateHql Update HQL.
     * @param values Parameters or null if none.
     * @return The affected rows.
     */
    protected int executeUpdate(final String updateHql, final Object[] values) {
        HibernateCallback updateCallback = new HibernateCallback() {
            public Object doInHibernate(Session session) throws HibernateException, SQLException {
                Query query = session.createQuery(updateHql);
                if(values!=null) {
                    for(int i=0; i<values.length; i++)
                        query.setParameter(i, values[i]);
                }
                return new Integer(query.executeUpdate());
            }
        };
        return ((Integer)hibernateTemplate.execute(updateCallback)).intValue();
    }

    /**
     * Prepared for sub-class for convenience. Query for list and also return 
     * total results' number.
     * 
     * @param selectCount HQL for "select count(*) from ..." and should return a Long.
     * @param select HQL for "select * from ..." and should return object list.
     * @param values For prepared statements.
     * @param page Page object for store page information.
     */
    protected List queryForList(final String selectCount, final String select, final Object[] values, final Page page) {
        Long count = (Long)queryForObject(selectCount, values);
        page.setTotalCount(count.intValue());
        if(page.isEmpty())
            return Collections.EMPTY_LIST;
        return queryForList(select, values, page);
    }

    /**
     * Prepared for sub-class for convenience. Query for list but do not return 
     * total results' number.
     * 
     * @param select HQL for "select * from ..." and should return object list.
     * @param values For prepared statements.
     * @param page Page object for store page information.
     */
    protected List queryForList(final String select, final Object[] values, final Page page) {
        // select:
        HibernateCallback selectCallback = new HibernateCallback() {
            public Object doInHibernate(Session session) {
                Query query = session.createQuery(select);
                if(values!=null) {
                    for(int i=0; i<values.length; i++)
                        query.setParameter(i, values[i]);
                }
                return query.setFirstResult(page.getFirstResult())
                            .setMaxResults(page.getPageSize())
                            .list();
            }
        };
        return (List) hibernateTemplate.executeFind(selectCallback);
    }

    /**
     * Prepared for sub-class for convenience. Query for unique result.
     * 
     * @param select HQL for "select * from ..." and should return unique object.
     * @param values For prepared statements.
     */
    protected Object queryForObject(final String select, final Object[] values) {
        HibernateCallback selectCallback = new HibernateCallback() {
            public Object doInHibernate(Session session) {
                Query query = session.createQuery(select);
                if(values!=null) {
                    for(int i=0; i<values.length; i++)
                        query.setParameter(i, values[i]);
                }
                return query.uniqueResult();
            }
        };
        return hibernateTemplate.execute(selectCallback);
    }

    protected Object queryForObject(final DetachedCriteria dc) {
        HibernateCallback callback = new HibernateCallback() {
            public Object doInHibernate(Session session) {
                return dc.getExecutableCriteria(session).uniqueResult();
            }
        };
        return hibernateTemplate.execute(callback);
    }

    

    /**
     * Prepared for sub-class for convenience.
     */
    protected Object uniqueResult(final DetachedCriteria dc) {
        HibernateCallback callback = new HibernateCallback() {
            public Object doInHibernate(Session session) {
                return dc.getExecutableCriteria(session).uniqueResult();
            }
        };
        return hibernateTemplate.execute(callback);
    }
    protected List queryForLists(final String select, final Object[] values) {
        // select:
        HibernateCallback selectCallback = new HibernateCallback() {
            public Object doInHibernate(Session session) {
                Query query = session.createQuery(select);
                if(values!=null) {
                    for(int i=0; i<values.length; i++)
                        query.setParameter(i, values[i]);
                }
                return query.list();
            }
        };
        return (List) hibernateTemplate.executeFind(selectCallback);
    }

}

/***************************應用******************************************/
public class RegionDAOImpl extends GenericHibernateDAOCrud<Region> implements IRegionDAO {
    
	public RegionDAOImpl(){
		
		super(Region.class);
	}

	public void deleteRegion(Region region) {
		hibernateTemplate.delete(region);
		
	}

	public void deleteRegion(Long id) {
		hibernateTemplate.delete(hibernateTemplate.get(Region.class, id));
		
	}

	public Region getRegion(Long id) {
		 
		return (Region)hibernateTemplate.get(Region.class, id);
	}

	public Long saveRegion(Region region) {
		hibernateTemplate.save(region);
		return region.getId();
	}

	public void updateRegion(Region region) {
		
		hibernateTemplate.saveOrUpdate(region);
	}
	
	/**
	 * 查詢父節點的所有子節點
	 * @param parent   父節點
	 * @return  該父節點對應的子節點
	 * 
	 * 
	 **/
	public List<Region> listRegionByParent(Region parent) {
		 if (parent==null){
			 return (List<Region>)hibernateTemplate.find("from Region as r where r.parent is null"); 
		 }else{
			 return (List<Region>)queryForLists("from Region as r where r.parent=?"
		     			 ,new Object[]{parent});
		     
		 }
	    
	}

	
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章