这是一个最接近的解决方案。专用 DAO 在业务层进行注释。与OP的问题一样,最好的努力是在EntityDAO通用模板本身中有一个带注释的DAO。类型擦除似乎不允许将专用类型信息传递到弹簧工厂[导致报告来自所有专用DAO的匹配豆]
通用实体 DAO 模板
public class EntityDAO<T>
{
@Autowired
SessionFactory factory;
public Session getCurrentSession()
{
return factory.getCurrentSession();
}
public void create(T record)
{
getCurrentSession().save(record);
}
public void update(T record)
{
getCurrentSession().update(record);
}
public void delete(T record)
{
getCurrentSession().delete(record);
}
public void persist(T record)
{
getCurrentSession().saveOrUpdate(record);
}
public T get(Class<T> clazz, Integer id)
{
return (T) getCurrentSession().get(clazz, id);
}
}
基于通用实体的业务层模板
public abstract class EntityBusinessService<T>
implements Serializable
{
public abstract EntityDAO<T> getDAO();
//Rest of code.
}
一个专门的实体 DAO 示例
@Transactional
@Repository
public class UserDAO
extends EntityDAO<User>
{
}
一个示例专用实体业务类
@Transactional
@Service
@Scope("prototype")
public class UserBusinessService
extends EntityBusinessService<User>
{
@Autowired
UserDAO dao;
@Override
public EntityDAO<User> getDAO()
{
return dao;
}
//Rest of code
}