【问题标题】:createCriteria is not valid without active transaction没有活动事务,createCriteria 无效
【发布时间】:2015-03-05 10:37:45
【问题描述】:

我正在使用Spring 4.1.3.RELEASEHibernate 4.3.7

在我尝试同时使用JTA 事务和Hibernate 条件查询时出现以下问题。代码:

@Resource
private UserTransaction userTransaction;

@Resource
private SessionFactory sessionFactory;

public User getUserById(Integer id){
    try {
        userTransaction.begin();
    } catch (Exception e) { }
    Criteria criteria = sessionFactory.getCurrentSession().createCriteria(User.class);
    criteria.add(Restrictions.eq("id", id));
    try {
        userTransaction.commit();
    } catch (Exception e) { }
    return (User) criteria.uniqueResult();
}

我得到了一个异常,即 createCriteria 在没有活动事务的情况下无效。通过使用调试器检查方法的代码,我确保我有一个有效的JTA - 事务。出了什么问题?

【问题讨论】:

  • 确保您已设置休眠以与 JTA 正确集成。
  • @M.Deinum 你的意思是<prop key="hibernate.current_session_context_class">thread</prop>吗?目前它被设置为线程。那是破旧的吗?
  • 一旦您基于 Spring,为什么不想使用 Spring 来管理您的事务?看看链接:spring.io/blog/2011/08/15/…
  • 这是错误的,是针对本地事务而不是 JTA。但正如@Hazhir 所说,如果您使用 Spring 来管理和配置事务,可以为您省去很多麻烦。

标签: java spring hibernate


【解决方案1】:

您可能在 userTransaction.begin() 上遇到了异常。你的 catch 什么都不做,所以 createCriteria() 失败,因为你没有事务。

【讨论】:

    【解决方案2】:

    一旦您基于 Spring,您为什么不想使用 Spring 来管理您的事务?看看链接: Configuring Spring and JTA without full Java EE

    【讨论】:

      猜你喜欢
      • 2016-05-19
      • 2013-12-16
      • 1970-01-01
      • 2014-08-13
      • 2012-08-13
      • 1970-01-01
      • 2011-06-19
      • 2018-12-31
      相关资源
      最近更新 更多