?? hibernatedaoimp.java
字號:
/**
* 2007/11/15
* @version
* @author
*/
package com.hb.core.dao.hibernateImp;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import org.hibernate.metadata.ClassMetadata;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.util.Assert;
import com.hb.core.dao.IGenericDao;
/**
* Hibernate Dao的泛型基類
*
* <pre>
* 繼承于Spring的HibernateDaoSupport
* 提供分頁函數和若干便捷查詢方法,并對返回值作了泛型類型轉換
* </pre>
*/
public class HibernateDaoImp<T> extends HibernateDaoSupport implements IGenericDao<T> {
/** 最大的ID */
protected final String DEFAULT_MAX_ID = "00000001";
protected Class<T> entityClass;// DAO所管理的Entity類型.
/**
* 取得entityClass.JDK1.4不支持泛型的子類可以拋開Class<T> entityClass,重載此函數達到相同效果。
*/
protected Class<T> getEntityClass() {
return entityClass;
}
/**
* 在構造函數中將泛型T.class賦給entityClass.
*/
@SuppressWarnings("unchecked")
public HibernateDaoImp() {
entityClass = getSuperClassGenricType(getClass());
}
@SuppressWarnings("unchecked")
public T get(Serializable id) {
return (T) getHibernateTemplate().get(entityClass, id);
}
@SuppressWarnings("unchecked")
public List<T> getAll() {
return getHibernateTemplate().loadAll(entityClass);
}
@SuppressWarnings("unchecked")
public String getIdName(Class clazz) {
Assert.notNull(clazz);
ClassMetadata meta = getSessionFactory().getClassMetadata(clazz);
Assert.notNull(meta, "Class " + clazz + " not define in hibernate session factory.");
String idName = meta.getIdentifierPropertyName();
Assert.hasText(idName, clazz.getSimpleName() + " has no identifier property define.");
return idName;
}
public void remove(Object o) {
getHibernateTemplate().delete(o);
}
public void removeById(Serializable id) {
remove(get(id));
}
public void save(T instance) {
getHibernateTemplate().saveOrUpdate(instance);
}
@SuppressWarnings("unchecked")
protected Class getSuperClassGenricType(Class clazz) {
return (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
// return getSuperClassGenricType(clazz, 0);
}
@SuppressWarnings("unchecked")
/**
* 通過反射,獲得定義Class時聲明的父類的范型參數的類型. 如public BookManager extends GenricManager<Book>
*
* @param clazz clazz The class to introspect
* @param index the Index of the generic declaration,start from 0.
* @return the index generic declaration, or <code>Object.class</code> if
* cannot be determined
*/
protected Class getSuperClassGenricType(Class clazz, int index) {
Type genType = clazz.getGenericSuperclass();
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
if (index >= params.length || index < 0) {
return Object.class;
}
if (!(params[index] instanceof Class)) {
return Object.class;
}
return (Class) params[index];
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -