如题:  
IGenericDao.java
public interface IGenericDao<T, ID extends Serializable> {          /**
 * 通过ID来得到实体对象
 * 
 * @param id
 *            实体对象的标识符
 * @param lock
 *            使用的锁模式
 * @return 该主键值对应的实体对象
 */
T findById(ID id, boolean lock);
/**
 * 将实体对象持久化
 * 
 * @param entity
 *            需要进行持久化操作的实体对象
 * @return 持久化的实体对象
 */
T saveOrUpdate(T entity);         ......
}GenericDao.java 实现IGenericDao 
public class GenericDao<T, ID extends Serializable> extends HibernateDaoSupport implements IGenericDao<T, ID>  { // 保持实体对象类的类型
private Class<T> persistentClass; public Class<T> getPersistentClass() {
return persistentClass;
} public GenericDao(Class<T> persistentClass) {
this.persistentClass = persistentClass;
} public GenericDao(){

} /**
 * 得到所有的实体对象
 * 
 * @return  
 */
public List<T> findAll() {
// TODO Auto-generated method stub
return findByCriteria();
} /**
 * 根据对象的属性和属性的值来得到满足条件的实体对象
 * 
 * @param exampleInstance
 *             
 * @return  
 */
public List<T> findByExample(T exampleInstance) {
// TODO Auto-generated method stub
return findByCriteria(Example.create(exampleInstance));
} /**
 * 通过ID来得到实体对象
 * 
 * @param id
 *             
 * @param lock
 *             
 * @return  
 */
@SuppressWarnings("unchecked")
public T findById(ID id, boolean lock) {
// TODO Auto-generated method stub
try {
T instance;
if (lock)
instance = (T) getHibernateTemplate().getSessionFactory().getCurrentSession().get(getPersistentClass(), id,
LockMode.UPGRADE);
else
instance = (T) getHibernateTemplate().getSessionFactory().getCurrentSession().get(getPersistentClass(), id);
return (T) instance;
} catch (RuntimeException re) {
throw re;
} } /**
 * 将实体对象持久化
 * 
 * @param entity
 *             
 * @return  
 */
public T saveOrUpdate(T entity) {
// TODO Auto-generated method stub
getHibernateTemplate().getSessionFactory().getCurrentSession().saveOrUpdate(entity);
return entity;
} /**
 * 将实体对象变为瞬态
 * 
 * @param entity
 *            
 */
public void delete(T entity) {
// TODO Auto-generated method stub
getHibernateTemplate().getSessionFactory().getCurrentSession().delete(entity);
} @SuppressWarnings("unchecked")
protected List<T> findByCriteria(Criterion... criterion) { try {
Criteria crit = getHibernateTemplate().getSessionFactory().getCurrentSession().createCriteria(getPersistentClass());
for (Criterion c : criterion) {
crit.add(c);
}
return crit.list();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
IUserInfoDAO 继承了 IGenericDao接口现在我的业务层想调用这个IUserInfoDAO 继承得到的 saveOrUpdate();  Spring 配置文件如何配置
路过的达人请帮忙解决下

解决方案 »

  1.   

    哈哈!我还想记得要spring3.xx才支持泛型吧!
      

  2.   

    配置和不用泛型时相同
    只不过在Service层写的时候要将“T”换成实体类
    如果你Service层也用了泛型,那么在action中声明Service的时候将“T”换成实体类
      

  3.   

    先谢谢两位回答     泛型DAO  需要 注入上层么?
      

  4.   

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="namingStrategy">
    <bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
    </property>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">${hibernate.dialect}</prop>
    <prop key="hibernate.hbm2ddl.auto">update</prop>
    <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
    <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
    <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider
    </prop>
    <prop key="hibernate.cache.provider_configuration_file_resource_path">/ehcache-hibernate.xml</prop>
    </props>
    </property>
    <property name="lobHandler">
    <ref bean="oracleLobHandler"/>
    </property>
    </bean> <!-- 事务配置 -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
    </bean>
      

  5.   


    private IUserInfoBiz iuserInfoBiz;
     
    public void setIntercontinentalDAO(IIntercontinentalDAO intercontinentalDAO) {
    this.intercontinentalDAO = intercontinentalDAO;
    }public ActionForward save(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {
    // TODO Auto-generated method stub
    UserInfoForm userInfoForm = (UserInfoForm) form;
    UserInfo u= new UserInfo();
    if (null != intercontinectalForm) {
    u= BeansUtils.copyProperties(
    new UserInfo (), userInfoForm );
    u.setId(null);
    } else
    u.setName(request.getParameter("name"));
    iuserInfoBiz.saveOrUpdate(u);
    return mapping.getInputForward();
    }
    这里没有T 饿 我的 Service 也是使用了泛型IUserInfoBiz 同样继承了 Service的泛型类public interface IUserInfoBiz extends IGenericDao<UserInfo, Integer> {}
    public class UserInfoBizImpl extends GenericDao<Action,Integer> implements IUserInfoBiz { public UserInfoBizImpl() {
    super(UserInfo.class);
    }}
      

  6.   

    先谢谢你的回复但我问的是 注入细节哦  泛型DAO   是所有DAO接口的父类 泛型实现类需要穿入 实体参数这样Spring配置文件具体怎么写呢?
    public class GenericDao<T, ID extends Serializable> extends HibernateDaoSupport implements IGenericDao<T, ID>  {    // 保持实体对象类的类型
        private Class<T> persistentClass;    public Class<T> getPersistentClass() {
            return persistentClass;
        }    public GenericDao(Class<T> persistentClass) {
            this.persistentClass = persistentClass;
        }
        ……
      

  7.   

    利用你的说法问题解决了一半了,但是业务层这里有点小问题。我将业务层的泛型CRUD去掉了正常注入没问题,现在我想用这个业务层的泛型CRUD,应该如何在业务泛型CRUD类  增加一个什么样的属性 能达到我调用相应的DAO呢? (就是说ACTION-->IUserInfoBiz-->UserInfoBizImpl-->GenericBizImpl-->saveOrUpdate()-->IUserInfoDAO)如何能让我的泛型业务  直接调用 底层IUserInfoDAO 的接口呢?
      

  8.   

    兄弟,你的问题解决了吗,我也想这样做,在 泛型service层 调用泛型dao,你知道怎么配吗
    注解也行
      

  9.   

    <bean id="baseDao" class="com.hz.dao.impl.BaseDAOImpl">
    <property name="sessionFactory">
    <ref bean="sessionFactory" />
    </property>
    </bean>
    <bean id="baseManager" class="com.hz.service.impl.BaseManagerImpl"
    abstract="true">
    <property name="baseDAO">
    <ref bean="baseDao" />
    </property>
    </bean>
    <bean id="admininfoManager" class="com.hz.service.impl.AdmininfoManagerImpl"
    parent="baseManager"></bean>