Hibernate DAO設計方法


Hibernateを学んでしばらく経ちましたが、最初はこう設計しました.
package com.zjut.DAO;

import java.util.List;

import com.zjut.PO.User;
public interface UserDAO {
public List getUsers();
public User getUserByID(int id);
public boolean deleteUserByID(int id);
public boolean updateUser(User user);
public boolean saveUser(User user);
//public List userList(int PageSize,int startRow);
//public int getUserRows(String query);
}


そしてクラスでこのインタフェースを実現します...これで終わりです.Userの操作はそれほど多くないので、ベースインタフェースを追加する必要はないと思いますが...その後:rainlife兄貴の設計思想に従います:
    rainlife     


    DAO    IGenericDAO,         CRUD  :

java   
 
/**  
 *      CRUD    
 * @author rainlife  
 */   
public interface IGenericDAO 〈T, ID extends Serializable〉 
{   
//              。   
    public T findById(ID id);   
       
//              ,           。   
    T findById(ID id, boolean lock);   
   
    //       。   
    List findAll();   
   
    //         ,         。   
    List findByExample(T exampleInstance);   
   
    //     。   
    T makePersistent(T entity);   
   
    //    。   
    void makeTransient(T entity);   
}   


     Hibernate        GenericDAOHibernate:

java   
 
/**  
 *     IGenericDAO   Hibernate  ,     CRUD  。  
 * @author rainlife  
 * @param  POJO   
 * @param   POJO         
 * @param       POJO  DAO      
 */   
public abstract class GenericDAOHibernate 〈T,ID extends Serializable, DAOImpl extends IGenericDAO〈T,ID〉〉 
        implements IGenericDAO〈T,ID〉 
{   
    private Class persistentClass;   
   
    protected Session session;   
   
    public GenericDAOHibernate()   
    {   
        this.persistentClass = (Class) ((ParameterizedType) getClass()   
                .getGenericSuperclass()).getActualTypeArguments()[0];   
    }   
   
    @SuppressWarnings("unchecked")   
    public DAOImpl setSession(Session s)   
    {   
        this.session = s;   
        return (DAOImpl)this;   
    }   
   
    protected Session getSession()   
    {   
        if (session == null)   
            throw new IllegalStateException(   
                    "Session has not been set on DAO before usage");   
        return session;   
    }   
   
    public Class getPersistentClass()   
    {   
        return persistentClass;   
    }   
   
       
    @SuppressWarnings("unchecked")   
    public T findById(ID id)   
    {   
        return (T) getSession().load(getPersistentClass(), id);   
    }   
       
    @SuppressWarnings("unchecked")   
    public T findById(ID id, boolean lock)   
    {   
        T entity;   
        if (lock)   
            entity = (T) getSession().load(getPersistentClass(), id, LockMode.UPGRADE);   
        else   
            entity = findById(id);   
   
        return entity;   
    }   
   
    @SuppressWarnings("unchecked")   
    public List findAll()   
    {   
        return findByCriteria();   
    }   
   
    @SuppressWarnings("unchecked")   
    public List findByExample(T exampleInstance)   
    {   
        Criteria crit = getSession().createCriteria(getPersistentClass());   
        Example example = Example.create(exampleInstance);   
        crit.add(example);   
        return crit.list();   
    }   
       
    @SuppressWarnings("unchecked")   
    public List findByExample(T exampleInstance, String[] excludeProperty)   
    {   
        Criteria crit = getSession().createCriteria(getPersistentClass());   
        Example example = Example.create(exampleInstance);   
        for (String exclude : excludeProperty)   
        {   
            example.excludeProperty(exclude);   
        }   
        crit.add(example);   
        return crit.list();   
    }   
   
    @SuppressWarnings("unchecked")   
    public T makePersistent(T entity)   
    {   
        getSession().saveOrUpdate(entity);   
        //getSession().save(entity);   
        return entity;   
    }   
   
    public void makeTransient(T entity)   
    {   
        getSession().delete(entity);   
    }   
   
    @SuppressWarnings("unchecked")   
    protected List findByCriteria(Criterion... criterion)   
    {   
        Criteria crit = getSession().createCriteria(getPersistentClass());   
        for (Criterion c : criterion)   
        {   
            crit.add(c);   
        }   
        return crit.list();   
    }   
       
    @SuppressWarnings("unchecked")   
    /**  
     *         。  
     */   
    protected List findByCriteria(Order order,Criterion... criterion)   
    {   
        Criteria crit = getSession().createCriteria(getPersistentClass());   
        for (Criterion c : criterion)   
        {   
            crit.add(c);   
        }   

        if(order!=null)   
            crit.addOrder(order);   
        return crit.list();   
    }   
       
    @SuppressWarnings("unchecked")   
    protected List findByCriteria(int firstResult,int rowCount,Order order,Criterion... criterion)   
    {   
        Criteria crit = getSession().createCriteria(getPersistentClass());   
        for (Criterion c : criterion)   
        {   
            crit.add(c);   
        }   
        if(order!=null)   
            crit.addOrder(order);   
        crit.setFirstResult(firstResult);   
        crit.setMaxResults(rowCount);   
        return crit.list();   
    }   
}   


  ,         DAO ,        Hibernate DAO   :

         IUserDAO  ,     IGenericDAO:


java   
public interface IUserDAO extends IGenericDAO〈User,Integer〉 
{   
    public User find(String username,String password);   
    public User find(String username);   
}   

 

    IGenericDAO  ,       IGenericDAO        CRUD  。


       IUserDAO  Hibernate  UserDAOHibernate:


java   
public class UserDAOHibernate extends GenericDAOHibernate〈User,Integer,IUserDAO〉 implements IUserDAO {       

   
    public User find(String username, String password) {   
        //           
    }   
   
    public User find(String username) {   
        //           
    }   
}   

 

UserDAOHibernate  GenericDAOHibernate   IUserDAO  ,  ,   UserDAOHibernate      CRUD  ,                。




しかし、POオブジェクトの操作が多い場合には、こんなに階層を分ける必要があるのではないかと思います....私の勉強が足りないのかもしれません.....みんなで話そう