org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started
org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started
产生的原因,先看UserDaoImpl类的内容如下:
@Component("userDao")
public class UserDaoImpl implements UserDao{
private HibernateTemplate hibernateTemplate;
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
@Resource
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
@Override
public void save(User user) {
this.hibernateTemplate.save(user);
}
@Override
public boolean exists(User user) {
SessionFactory sessionFactory=hibernateTemplate.getSessionFactory();
Session session=sessionFactory.getCurrentSession();
session.beginTransaction();
//利用hql来查询数据库中是否已经存在此名字的用户
String hql="from User as u where u.username=?";
Query query=session.createQuery(hql);
query.setString(0, user.getUsername());
List list=query.list();
if(!list.isEmpty()){
return true;
}
session.getTransaction().commit();
return false;
}
}
在UserDaoImpl的实现中,出现了
SessionFactory sessionFactory=hibernateTemplate.getSessionFactory();
Session session=sessionFactory.getCurrentSession();
来获取Session,而修改为通过openSession()来获取Session问题就解决了。
SessionFactory sessionFactory=hibernateTemplate.getSessionFactory();
Session session=sessionFactory.openSession();
或者是,修改UserDaoImpl类中的exists方法,完成相同的功能,如下:
@Override
public boolean exists(User user) {
List res=hibernateTemplate.find("from User as u where u.username=?", user.getUsername());
if(res!=null&&res.size()>0){
return true;
}
return false;
}
参考资料:http://wangjianwei866.blog.163.com/blog/static/9295823200993042414431/