我用反射(Kevin Bowersox)实现了一个众所周知的泛型dao模式:
public class NewBaseDaoImpl<T, ID extends Serializable> implements NewBaseDao<T,ID> {
private Class<T> entity;
@PersistenceContext(unitName = "orm-unit")
private EntityManager em;
@SuppressWarnings("unchecked")
public NewBaseDaoImpl(){
this.entity = (Class<T>)((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
@Override
public T read(ID id) {
return em.find(this.getEntity(), id);
}
插入数据工作正常,但当我尝试通过id查找实体时,如下所示:
RepairShop rs = (RepairShop) bean.read(1L);
我明白了:
java.lang.IllegalArgumentException:未知实体:java.lang.Object (org.hibernate.MappingException:未知实体:java.lang.Object)
有什么问题?
答案 0 :(得分:0)
如果没有看到子类的签名,我无法确定,但可能是您的类型层次结构过于复杂,无法使用您正在采用的方法来解析实体类型。您可以尝试使用TypeTools:
entity = (Class<T>)TypeResolver.resolveRawArgument(NewBaseDao.class, getClass());
文档实际上也包含generic DAO example。