在解決了Spring的范型支持的問題后,開始考慮Hibernate的范型支持的問題,但始終受困于如何在范型類中根據(jù)T得到class,因?yàn)椴荒芎唵蔚恼{(diào)用T.getClass來獲得class,直到昨天看到江南白衣的blog上的那篇文章,終于發(fā)現(xiàn)了解決辦法,即定義一個(gè)范型父類AbstractBaseService,在其中實(shí)現(xiàn)基本的CRUD操作,然后UserService繼承AbstractBaseService,這樣完美的實(shí)現(xiàn)了Spring、Hibernate對于范型的支持,可以大量簡化開發(fā)工作。當(dāng)然,現(xiàn)在還有個(gè)局限,即只能通過繼承父類的方法來實(shí)現(xiàn)在父類中獲得T的class。
相關(guān)實(shí)現(xiàn)的代碼:
UserServiceImp.java
public class UserServiceImp extends AbstractBaseService<User> implements
UserService {
public UserServiceImp()
{
super("User");
}
@Override
public User add(User obj) {
obj = super.add(obj);
this.getCache().addToCache(obj, this.getGetAllKey(), obj.getId());
this.getCache().putCountKey(this.getGetAllCountKey());
return obj;
}
}
AbstractBaseService.java
public abstract class AbstractBaseService<T>{
private Class<T> entityClass;
private Log logger = null;
private String tableName;
private RootService<T> rootService;
private CacheService<T> cache;
public void setCache(CacheService<T> cacheService) {
this.cache = cacheService;
cache.setEntityClass(entityClass);
cache.setTableName(tableName);
}
public AbstractBaseService(String tableName) {
this.tableName = tableName;
entityClass = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
logger = LogFactory.getLog(entityClass);
}
public T findByID(Serializable id) {
return cache.getObjectFormCacheByID(id.toString());
}
public T add(T obj)
{
try {
obj = rootService.insertObject(obj);
return obj;
} catch (DataAccessException ex) {
logger.error("add(T obj):", ex.getCause());
return null;
}
}
public T save(T obj) {
try {
rootService.saveObject(obj);
return obj;
} catch (DataAccessException ex) {
logger.error("save(T obj):" + ex);
return null;
}
}
public void delete(T obj)
{
rootService.deleteObject(obj);
}
}
以上代碼也考慮對緩存的支持,關(guān)于緩存的實(shí)現(xiàn),留待下次專門討論。