泛型 Hibernate DAO 例
import java.io.Serializable;
import java.util.List;
public interface GenericDAO<T, ID extends Serializable> {
List<T> findAll();
T persist(T entity);
void remove(T entity);
}
=========
import java.io.Serializable;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.LockMode;
import org.hibernate.criterion.Criterion;
import org.hibernate.Criteria;
import java.lang.reflect.ParameterizedType;
public class GenericHibernateDAO<T, ID extends Serializable>
implements GenericDAO<T, ID> {
private Class<T> persistentClass;
private Session session;
public GenericHibernateDAO() {
this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
public GenericHibernateDAO(Class<T> type) {
this.persistentClass = type;
}
@SuppressWarnings("unchecked")
public void setSession(Session s) {
this.session = s;
}
protected Session getSession() {
if (session == null)
throw new IllegalStateException("Session has not been set on DAO before usage");
return session;
}
public Class<T> getPersistentClass() {
return persistentClass;
}
/* 取实体全集 */
@SuppressWarnings("unchecked")
public List<T> findAll() {
return findByCriteria();
}
/**
* Use this inside subclasses as a convenience method.
*/
@SuppressWarnings("unchecked")
protected List<T> findByCriteria(Criterion... criterion) {
Criteria crit = getSession().createCriteria(getPersistentClass());
for (Criterion c : criterion) {
crit.add(c);
}
return crit.list();
}
/* 保存实体 */
@SuppressWarnings("unchecked")
public T persist(T entity) {
getSession().saveOrUpdate(entity);
return entity;
}
/* 删除实体 */
public void remove(T entity) {
getSession().delete(entity);
}
public void flush() {
getSession().flush();
}
public void clear() {
getSession().clear();
}
}
========
......
GenericHibernateDAO<Book,Integer> _dao =
new GenericHibernateDAO<Book,Integer>(Book.class);