我已经因为这个问题而被困了一个星期,并且无法使用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,因为它会引发一个期望。
问题出现在UserServiceImpl
集UserDaoI
为@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中声明
非常感谢!
答案 0 :(得分:-1)
问题是:
'userDaoImpl':注入自动连接的依赖项失败了......:无法自动装配字段:
,因为
找不到类型为[org.hibernate.SessionFactory]的限定bean用于依赖:预期至少有1个bean有资格作为autowire候选者
在您的模型中,您需要定义一个带有userDaoImpl
注释和Hibernate @Bean
的{{1}} bean,以允许Spring创建并注入它,例如:添加方法到这样的SessionFactory
班级:
<强> UserServiceImpl.java 强>
UserServiceImpl
但是我注意到一些类型和模型的混合,但是,我认为这是问题的根源,因此我将解释服务与DAO 模型如何通常使用更简单的模型
在“服务和数据访问对象”模型中,您为每个实体创建持久性中介,通常使用DAO后缀,实体通常是简单的普通Java对象(POJO)。
例如,要表示内存中用户,可以按如下方式对实体建模:
<强> 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提供程序一起使用来“丢失”(实际上完全相反)。