-
基于泛型
DAO
的<
/p>
spring
和
hibernate
p>
的集成
(
转
) <
/p>
编写
Spring+Hibernate
框架下的应用,
总是离不了编写一个通用的泛型
Generic
HibernateDao
。
查阅了网上不少的
GenericHibernateDao
实现,归纳整理为如下实现,供后续
编码参考。
首先定义接口泛型
p>
DAO
接口
GenericDao
package
import
izable;
import tion;
import
or;
import
import ia;
import de;
import
edCriteria;
public interface GenericDao
// --------------------
基本检索、增加、修改、删除操作
--------------------
//
根据主键获取实体。如果没有相应的实体,返回
null
。
public T get(PK id);
//
根据主键获取实体并加锁。如果没有相应的实体,返回
null
。
public T getWithLock(PK id, LockMode
lock);
//
根据主键获取实体。如果没有相应的实体,抛出异常。
public T load(PK id);
//
根据主键获取实体并加锁。如果没有相应的实体,抛出异常。
public T loadWithLock(PK
id, LockMode lock);
//
获取全部实体。
public List
// loadAllWithLock() ?
//
更新实体
public void update(T entity);
//
更新实体并加锁
public void updateWithLock(T entity,
LockMode lock);
//
存储实体到数据库
public void save(T entity);
// saveWithLock()
//
增加或更新实体
public void saveOrUpdate(T entity);
//
增加或更新集合中的全部实体
public void
saveOrUpdateAll(Collection
//
删除指定的实体
public void delete(T entity);
//
加锁并删除指定的实体
public void deleteWithLock(T entity,
LockMode lock);
//
根据主键删除指定实体
public void
deleteByKey(PK id);
//
根据主键加锁并删除指定的实体
public void
deleteByKeyWithLock(PK id, LockMode lock);
//
删除集合中的全部实体
public void deleteAll(Collection
// -------------------- HSQL
----------------------------------------------
//
使用
HSQL
语句直接增加、更新、删除实体
public int
bulkUpdate(String queryString);
//
使用带参数的
HSQL
语句增加、更新、删除实体
public int
bulkUpdate(String queryString, Object[] values);
//
使用
HSQL
语句检索数据
public List find(String
queryString);
//
使用带参数的
HSQL
语句检索数据
public List find(String queryString,
Object[] values);
//
使用带命名的参数的
HSQL<
/p>
语句检索数据
public List findByNamedParam(String
queryString, String[] paramNames,
Object[] values);
//
使用命名的
HSQL
语句检索数据
public List
findByNamedQuery(String queryName);
//
使用带参数的命名
p>
HSQL
语句检索数据
public List
findByNamedQuery(String queryName, Object[]
values);
//
使用带命名参数的命名
HSQL
语句检
索数据
public
List findByNamedQueryAndNamedParam(String
queryName,
String[] paramNames, Object[] values);
//
使用
HSQL
语句检索数据,返回
Iterator
public Iterator iterate(String
queryString);
//
使用带参数
HSQL
语句检索数据,返回
Iterator
public Iterator
iterate(String queryString, Object[] values);
//
关闭检索返回的
Iterator
public void
closeIterator(Iterator it);
//
-------------------------------- Criteria
------------------------------
//
创建与会话无关的检索标准对象
public DetachedCriteria
createDetachedCriteria();
//
创建与会话绑定的检索标准对象
public Criteria
createCriteria();
//
使用指定的检索标准检索数据
public List
findByCriteria(DetachedCriteria criteria);
//
使用指定的检索标准检索数据,返回部分记录
public List
findByCriteria(DetachedCriteria criteria, int
firstResult,
int
maxResults);
//
使用指定的实体及属性检索(满足除主键外属性=实体值)数据
public List
//
使用指定的实体及属性
(
非主键
)
检索(满足属性
like
串实体值)数据
public List
//
使用指定的检索标准检索数据,返回指定范围的记录
public Integer
getRowCount(DetachedCriteria criteria);
//
使用指定的检索标准检索数据,返回指定统计值
public Object
getStatValue(DetachedCriteria criteria, String
propertyName,
String StatName);
//
-------------------------------- Others
--------------------------------
//
加锁指定的实体
public void lock(T entity, LockMode
lockMode);
//
强制初始化指定的实体
public void
initialize(Object proxy);
//
强制立即更新缓冲数据到数据库(否则仅在事务提交时才更新)
public void flush();
}
实现
GenericDao
接口的
Hibe
rnate
的实现类
GenericHibernateDao
package
import
izable;
import terizedType;
import
import tion;
import or;
import
import tyUtils;
import ia;
import de;
import
edCriteria;
import e;
import
ode;
import
import tions;
import ctions;
import
ateDaoSupport;
@SuppressWarnings(
public
class GenericHibernateDao
extends HibernateDaoSupport implements
GenericDao
// <
/p>
实体类类型
(
由构造方法自动赋值
)
private
Class
//
构造方法,根据实例类自动获取实体类类型
public GenericHibernateDao() {
Class = null;
Class c =
getClass();
Type t =
ericSuperclass();
if
(t instanceof ParameterizedType) {
Type[] p = ((ParameterizedType)
t).getActualTypeArguments();
Class = (Class
}
}
//
--------------------
基本检索、增加、修改、删除操作
--------------------
//
根据主键获取实体。如果没有相应的实体,返回
null
。
public T get(PK id) {
return (T)
getHibernateTemplate().get(entityClass, id);
}
//
根据主键获取实体并加锁。如果没有相应的实体,返回
null
。
public T getWithLock(PK id, LockMode
lock) {
T t = (T)
getHibernateTemplate().get(entityClass, id, lock);
if (t != null) {
(); //
立即刷新,否则锁不会生效。
}
return
t;
}
//
根据主键获取实体。如果没有相应的实体,抛出异常。
public T load(PK id) {
return (T)
getHibernateTemplate().load(entityClass, id);
}
//
根据主键获取实体并加锁。如果没有相应的实体,抛出异常。
public T loadWithLock(PK
id, LockMode lock) {
T t = (T)
getHibernateTemplate().load(entityClass, id,
lock);
if (t !=
null) {
(); //
立即刷新,否则锁不会生效。
}
return
t;
}
//
获取全部实体。
public List
return (List
}