为什么我的DAO课程没有被扫描?

时间:2016-04-02 15:39:53

标签: spring hibernate spring-mvc

我已经因为这个问题而被困了一个星期,并且无法使用Spring工具套件在我的项目中找到解决方案。

我的调度程序扫描包并为控制器和服务层创建bean,但它似乎无法到达模型层。

这是我的servlet-context.xml

                               

<beans:bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <!-- <beans:property name="dataSource" ref="dataSource"/> -->
    <beans:property name="configLocation" value="classpath:hibernate-annotation.cfg.xml" />
</beans:bean>

<tx:annotation-driven/>
<!-- <beans:bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <beans:property name="sessionFactory" ref="sessionFactory" />
</beans:bean> -->

我已经评论了transactionManager bean,因为它会引发一个期望。

问题出现在UserServiceImplUserDaoI@Autowired

@Service
public class UserServiceImpl implements UserServiceI{

  private static final Logger logger = 
    Logger.getLogger(UserServiceImpl.class);

  @Autowired
  UserDaoI userDao;

  public boolean isRegisteredUser(User user){
    logger.debug("Entrando en isRegisteredUser" + logger.getClass());
    boolean isRegistered = false;
    UserDao uDao = userDao.getUserByDni(user.getDni());
    if(!(uDao.getEmail().equals(user.getEmail()))){
        isRegistered = true;
    }
    return isRegistered;
}

我无能为力,绝望。

编辑:

这是我的UserDaoI课程,但我认为不相关。

public interface UserDaoI {
  void addUser(UserDao userDao);
  UserDao getUser(int id);
  boolean updateUser(UserDao userDao);
  boolean deleteUser(int id);
  List<UserDao> getAllUsers();
  UserDao getUserByDni(String dni);
}

这是我UserDaoImpl.java,问题的根源。

@Repository
public class UserDaoImpl implements UserDaoI{

    private static final Logger logger = LoggerFactory.getLogger(UserDaoImpl.class);

    @Autowired
    SessionFactory sessionFactory;

    Session session;

    @Override
    public void addUser(UserDao userDao) {

        session = sessionFactory.openSession();
        session.beginTransaction();
        session.save(userDao);
        session.getTransaction().commit();
        session.close();
    }

    @Override
    public UserDao getUser(int id) {
        //sessionFactory = HibernateUtil.getSessionFactory();
        session = sessionFactory.openSession();
        session.beginTransaction();
        UserDao userDao = (UserDao) session.get(UserDao.class, id);
        session.getTransaction().commit();
        session.close();
        return userDao;
    }

    @Override
    public boolean updateUser(UserDao userDao) {
        assert(userDao!=null);
        //sessionFactory = HibernateUtil.getSessionFactory();
        session = sessionFactory.openSession();
        session.beginTransaction();
        session.update(userDao);
        session.getTransaction().commit();
        session.close();
        return false;
    }

    @Override
    public boolean deleteUser(int id) {
        //sessionFactory = HibernateUtil.getSessionFactory();
        session = sessionFactory.getCurrentSession();
        UserDao userDao = new UserDao();
        userDao.setId(id);
        if(getUser(id)!=null){
            try{
                session.beginTransaction();
                session.delete(userDao);
                session.getTransaction().commit();
                return true;

            }catch(Exception ex){
                logger.error("No se ha podido borrar el usuario");
            }finally{
                session.close();
            }
        }
        return false;
    }

    @Override
    public List<UserDao> getAllUsers() {
        //sessionFactory = HibernateUtil.getSessionFactory();
        session = sessionFactory.openSession();
        session.beginTransaction();
        @SuppressWarnings("unchecked")ArrayList<UserDao> userDaoList = (ArrayList<UserDao>) session.createQuery("from user").list();
        session.getTransaction().commit();
        session.close();
        return userDaoList;
    }

    @Override
    public UserDao getUserByDni(String dni) {

        session = sessionFactory.getCurrentSession();
        session.beginTransaction();
        UserDao userDao = (UserDao) session.createQuery("from user where dni = " + dni).uniqueResult();
        session.getTransaction().commit();
        session.close();
        return userDao;
        }   
}

为什么我不需要自动发送会话?

这是我的hibernate配置

<hibernate-configuration>
   <session-factory>
   <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
   <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
   <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/gen</property>
   <property name="hibernate.connection.username">root</property>
   <property name="hibernate.connection.password">fiw48asi</property>
   <property name="hibernate.current_session_context_class">thread</property>
   <property name="hibernate.hbm2ddl.auto">update</property>
   <property name="show_sql">true</property>
   <mapping class="com.library.app.dao.user.UserDao"/>


</session-factory>

现在我得到的例外是

org.hibernate.hql.internal.ast.QuerySyntaxException: user is not mapped

但它在hibernate-annotation.cfg.xml中声明

非常感谢!

1 个答案:

答案 0 :(得分:-1)

问题是:

  

'userDaoImpl':注入自动连接的依赖项失败了......:无法自动装配字段:

,因为

  

找不到类型为[org.hibernate.SessionFactory]的限定bean用于依赖:预期至少有1个bean有资格作为autowire候选者

在您的模型中,您需要定义一个带有userDaoImpl注释和Hibernate @Bean的{​​{1}} bean,以允许Spring创建并注入它,例如:添加方法到这样的SessionFactory班级:

<强> UserServiceImpl.java

UserServiceImpl

但是我注意到一些类型和模型的混合,但是,我认为这是问题的根源,因此我将解释服务与DAO 模型如何通常使用更简单的模型

在“服务和数据访问对象”模型中,您为每个实体创建持久性中介,通常使用DAO后缀,实体通常是简单的普通Java对象(PO​​JO)。

例如,要表示内存中用户,可以按如下方式对实体建模:

<强> User.java

@Bean
public UserDaoI userDao() {
    return new UserDaoImpl();
}

现在我们需要一个可以从我们的数据库中创建,读取,更新和删除这些实体的中介。在DAO模式中,这是实体DAO的角色:

<强> UserDao.java

public class User {
    private String name;

    // more POJO properties as need..

    public void setName(String name) {
        this.name = name;
    }

    public String getName(String name) {
        return this.name;
    }

    // more POJO setters and getters...
}

当服务跨越实体或向实体添加一些(可能更改)业务逻辑时,我们在DAO层之上添加服务层。例如,假设我们有一个注册表,它为每个用户捕获各种状态的注册记录:

<强> UserService.java

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;


public class UserDao {

    @Autowired
    private SessionFactory sessionFactory;

    public User getUser(long id) {
        sessionFactory.getCurrentSession().get(User.class, id);
    }

    public void addUser(User user) {
        sessionFactory.getCurrentSession().saveOrUpdate(user);
    }

    //...
}

但是,对于Spring 4,我不再手工编写DAO图层了;相反,我将Spring Data JPA与Hibernate JPA提供程序一起使用。 Here's a very simple example of how to make this work。你已经在使用Hibernate ORM了,所以你不要通过将Spring Data JPA与Hibernate JPA提供程序一起使用来“丢失”(实际上完全相反)。