Transaction not successfully started出现错误解决方法

首先了解

  • getCurrentSession();
  • openSession();
    1.当您调用SessionFactory时。getCurrentSession,它将为您提供处于休眠上下文中并由休眠内部管理的会话对象。它绑定到事务范围。
    当您调用SessionFactory时。getCurrentSession,如果不存在,它会创建一个新会话,否则使用当前休眠上下文中的相同会话。当事务结束时,它会自动刷新并关闭会话,因此您不需要在外部执行。
    如果您在单线程环境中使用休眠,您可以使用getCurrentSession,因为与每次创建新会话相比,它的性能更快。
    您需要向hibernate.cfg.xml添加以下属性才能使用getCurrentSession方法
	 <property name="hibernate.current_session_context_class">thread</property>

如果不配置上述属性,将会出现如下错误:

Exception in thread “main” org.hibernate.HibernateException: No CurrentSessionContext configured!
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1012)
at com.arpit.java2blog.hibernate.HibernateSessionExample.main(HibernateSessionExample.java:14)

2当您调用SessionFactory.openSession时,它总是会重新创建新的会话对象并将其交给您。您需要显式刷新和关闭这些会话对象。由于会话对象不是线程安全的,您需要在多线程环境中为每个请求创建一个会话对象,在网络应用程序中也为每个请求创建一个会话。

简单地说:

getCurrentSession的话会自动关闭,而openSession需要你手动关闭。如果你正在查询,使用的openSession而没有手动关闭,多次之后会导致连接池溢出,系统会挂掉的~

出现了Transaction not successfully started错误,
主要问题:在进行更新和提交操作时出现以下异常,

public class LinkmanServiceImpl implements LinkmanService{
	private CustomerDao customerDao=new CustomerDaoImpl();
	private LinkManDao linkManDao = new LinkManDaoImpl();
	public void save(LinkMan linkMan) {
//		//得到与线程绑定的Session对象
//		Session session = HibernateUtils.openSession();
//		//开启事务
//		Transaction ts = session.beginTransaction();
//		//HibernateUtils.getCurrentSession().beginTransaction();
//		//调用Dao保存客户
		HibernateUtils.getCurrentSession().beginTransaction();
		try {
			Long cust_id = linkMan.getCust_id();
			Customer c = customerDao.getById(cust_id);
			linkMan.setCustomer(c);
			linkManDao.save(linkMan);
		} catch (Exception e) {
			System.out.println("出现错误【抛出异常】");
			e.printStackTrace();
			//回滚事务
			//回滚事务
			HibernateUtils.getCurrentSession().getTransaction().rollback();
		}
		
		HibernateUtils.getCurrentSession().getTransaction().commit();
	}

}

猜你喜欢

转载自blog.csdn.net/qq_40709110/article/details/88625932