为什么openSession不起作用,但getCurrentSession在Spring Hibernate中工作

我已经编写了一个示例Spring Hibernate应用程序o了解Spring hibernate集成的工作原理。

这是我的applicationContext.xml

              org.hibernate.dialect.Oracle10gDialect true        

然后,我的服务类就是这样

 package com.general; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; @Service("employeeService") public class EmployeeServiceImpl implements EmployeeService{ @Autowired private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } @Transactional public void saveEmployee(Employee emp) { Session session = sessionFactory.getCurrentSession();//.openSession(); session.save(emp); } } 

而我的主要课程是

 public class App { public static void main(String[] args) { System.out.println("load context"); ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Employee em = new Employee(); em.setId(1l); em.setName("John"); EmployeeService emService = (EmployeeService) context.getBean("employeeService"); emService.saveEmployee(em); } } 

如果我使用getCurrentSession方法运行此应用程序,那么它运行正常,员工将保存到数据库中,但如果我使用openSession方法,则不会触发任何SQL查询,因此不会将任何内容保存到数据库中。

我不确定为什么会这样。 可能是我对getCurrentSession()和openSession()没有正确的理解。 可以请有人让我知道背后的原因。

事实上, @Service注释类中的方法上的@Transactional以及TransactionManager意味着整个事务生命周期将由Spring管理。

调用saveEmployee方法时,Spring将打开一个Session ,启动一个事务,执行代码,提交事务并关闭Session 。 它启动的Session绑定到当前线程,并通过getCurrentSession()

如果改为使用openSession() ,则打开一个完全不相关的 Session ,而不是由Spring的TransactionManager管理。 因此, 除非您自己执行,否则不会提交事务,也不会关闭Session