sessionFactory.getCurrentSession()正在使用@Transactional但是sessionFactory.openSession()不是

时间:2016-07-08 10:32:48

标签: java hibernate spring-mvc transactions

以下代码无效。问题是事务未在db

中提交

案例1:

            @Transactional
            public void save(Person p) {
                Session session= sessionFactory.openSession();
                session.saveOrUpdate(p);
                session.close();
            }

但是当我使用下面的代码时,它工作正常:

案例2:

            @Transactional
            public void save(Person p) {
                this.sessionFactory.getCurrentSession().saveOrUpdate(p);
            }

查询:

  1. 对于案例1问题,我在google上搜索@Transactional无法正常工作。但是,当我错误地使用Case 2时,它就开始工作了。为什么呢?

  2. 使用Case 2解决方案后,我在hibernate属性中添加了以下行

    的hibernate.current_session_context_class =螺纹

  3. 它开始给我错误,然后交易没有激活。

    什么是实际错误?

1 个答案:

答案 0 :(得分:1)

  1. 当您致电session.saveOrUpdate(p);时 你告诉Hibernate更新或添加实体。 但是,相应的记录仍然不存在于底层数据库中。
  2. 您需要调用session.flush()才能将数据库与Hibernate会话同步。

    请注意,如果您的程序在没有调用session.flush()的情况下结束,那么该记录将不会更新。

    1. 使用'线程'
    2. 进行配置时
        

      的hibernate.current_session_context_class =螺纹

      Hibernate会将从getCurrentSession()返回的Session绑定到当前线程,您必须以编程方式管理事务。

      Session session = sessionFactory.getCurrentSession();
      session.beginTransaction();
      ...
      //code here
      ...
      session.getTransactionCommit();