Spring 访问DAO时,sessionFactory为空

Spring 访问DAO时,sessionFactory为空,spring,hibernate,spring-mvc,Spring,Hibernate,Spring Mvc,我试图集成Spring+Hibernate4,但当我访问DAO时,sessionFactory对象上会出现一个nullPointerException 这是我的抽象道: @Repository public class AbstractDaoHibernateImpl { private SessionFactory sessionFactory; public AbstractDaoHibernateImpl() { } @Autowired

我试图集成Spring+Hibernate4,但当我访问DAO时,sessionFactory对象上会出现一个nullPointerException

这是我的抽象道:

@Repository
public class AbstractDaoHibernateImpl {



    private SessionFactory sessionFactory;


    public AbstractDaoHibernateImpl() {

    }


    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }


    protected Session getSession() {
        return getSessionFactory().getCurrentSession();
    }

    protected Order getOrder(String orderBy, boolean isOrderAsc) {
        if (isOrderAsc)
            return Order.asc(orderBy);
        else
            return Order.desc(orderBy);
    }
}
这是我的实体bean配置:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

    <!-- transacciones -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="SessionFactory"/>
    </bean>
    <!--Beans de los servicios de la aplicacion -->
    <bean id="userService" class="com.app.service.user.UserServiceImpl"/>

    <bean name="userDAO" class="com.app.model.user.dao.UserDaoImpl">
        <property name="sessionFactory" ref="SessionFactory" />
    </bean>

    <bean id="SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${jdbc.dialect}</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>


</beans>
编辑:userDao:

public class UserDaoImpl extends GenericDaoHibernateImpl<Usuario, Long> implements IUserDao {


}
公共类UserDaoImpl扩展了GenericDaoHibernateImpl实现IUserDao{
}
它扩展了GenericDao:

public class GenericDaoHibernateImpl<E, PK extends Serializable> extends AbstractDaoHibernateImpl implements GenericDao<E, PK> {

private Class<E> entityClass;
    public GenericDaoHibernateImpl() {
        this.entityClass = (Class<E>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

public List<E> findAll() throws GenericDataBaseException {
        try {
            Criteria criteria = getSession().createCriteria(getEntityClass());

            List<E> result = criteria.list();
            /*
             * if (result == null || result.size() == 0) throw new
             * NoSearchResultException("", getEntityClass().getName());
             */
            return result;
        } catch (Throwable t) {
            Collection<Object> args = new ArrayList<Object>();
            throw exceptionHandler.handle(this, t, "findAll", args);
        }
    }
    (...)
}
公共类GenericDaoHibernateImpl扩展了AbstractDaoHibernateImpl实现GenericDao{
私有类实体类;
公共GenericDaoHibernateImpl(){
this.entityClass=(类)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
public List findAll()引发GenericDataBaseException{
试一试{
Criteria=getSession().createCriteria(getEntityClass());
列表结果=criteria.List();
/*
*如果(result==null | | result.size()==0)抛出新
*NoSearchResultException(“,getEntityClass().getName());
*/
返回结果;
}捕获(可丢弃的t){
集合args=newarraylist();
抛出exceptionHandler.handle(this,t,“findAll”,args);
}
}
(...)
}
让我猜一猜


您的DAO是否在包
com.app.controllers
下?如果没有将
dao
包添加到组件扫描中,如
中所示,我看不到代码中任何地方定义的事务

在这种情况下,我建议您将它们放在您的服务方法上:

@Transactional(readOnly = true)
public List<User> getUsers() throws GenericDataBaseException {
        return userDao.findAll();
    }
@Transactional(readOnly=true)
public List getUsers()引发GenericDataBaseException{
返回userDao.findAll();
}

但您似乎正在开发一个相当复杂的类层次结构,您所需要的只是一个通用存储库,然后是一个。您不必使用服务类,只有在使用多个聚合根/复杂逻辑时才建议使用它们,而不是简单的getter。

谢谢。我是从一个控制器那里呼叫服务的,这还不够吗?不管怎样,我照你说的做了,但我也有同样的例外…我的错。前面我刚刚提到了
com.app.dao
。将答案更正为
com.app.model.user.dao
。我想你在尝试时做了正确的事情。是的,但也没有任何效果:(当你使用
@Autowired
时,setter不是强制性的。就像你对另一个类所做的那样,只需将字段标记为Autowired就可以了。我们可以看到你的UserDAOImpl(至少是声明性部分)吗事务在哪里?这似乎已经正确地注入了sessionFactory。我不知道您必须使每个方法都具有事务性。
public class UserDaoImpl extends GenericDaoHibernateImpl<Usuario, Long> implements IUserDao {


}
public class GenericDaoHibernateImpl<E, PK extends Serializable> extends AbstractDaoHibernateImpl implements GenericDao<E, PK> {

private Class<E> entityClass;
    public GenericDaoHibernateImpl() {
        this.entityClass = (Class<E>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

public List<E> findAll() throws GenericDataBaseException {
        try {
            Criteria criteria = getSession().createCriteria(getEntityClass());

            List<E> result = criteria.list();
            /*
             * if (result == null || result.size() == 0) throw new
             * NoSearchResultException("", getEntityClass().getName());
             */
            return result;
        } catch (Throwable t) {
            Collection<Object> args = new ArrayList<Object>();
            throw exceptionHandler.handle(this, t, "findAll", args);
        }
    }
    (...)
}
@Transactional(readOnly = true)
public List<User> getUsers() throws GenericDataBaseException {
        return userDao.findAll();
    }