【问题标题】:sessionFactory.getCurrentSession() was working with @Transactional but sessionFactory.openSession() was notsessionFactory.getCurrentSession() 正在使用 @Transactional 但 sessionFactory.openSession() 不是
【发布时间】:2016-11-10 21:29:54
【问题描述】:

以下代码不起作用。问题是事务没有在 db 中提交

案例一:

            @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 不起作用。但是当我错误地使用案例 2 时,它就开始工作了。为什么?

  2. 使用案例2解决方案后,当我在休眠属性中添加以下行时

    hibernate.current_session_context_class=线程

它开始给我错误,然后交易不活跃。

什么是实际错误?

【问题讨论】:

  • session.flush();没有写

标签: java hibernate spring-mvc transactions


【解决方案1】:
  1. 当您拨打电话至session.saveOrUpdate(p); 你告诉 Hibernate 更新或添加实体。 但是,相应的记录仍然不会存在于底层数据库中。

您需要调用session.flush() 以便将数据库与Hibernate 会话同步。

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

  1. 当您使用“线程”进行配置时

hibernate.current_session_context_class=线程

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-21
    • 2017-06-01
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多