Hibernate DAO設計方法
Hibernateを学んでしばらく経ちましたが、最初はこう設計しました.
そしてクラスでこのインタフェースを実現します...これで終わりです.Userの操作はそれほど多くないので、ベースインタフェースを追加する必要はないと思いますが...その後:rainlife兄貴の設計思想に従います:
しかし、POオブジェクトの操作が多い場合には、こんなに階層を分ける必要があるのではないかと思います....私の勉強が足りないのかもしれません.....みんなで話そう
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オブジェクトの操作が多い場合には、こんなに階層を分ける必要があるのではないかと思います....私の勉強が足りないのかもしれません.....みんなで話そう