【问题标题】:Execute query with native query (update query) in Hibernate 5.x在 Hibernate 5.x 中使用本机查询(更新查询)执行查询
【发布时间】:2018-03-29 19:02:51
【问题描述】:

我目前正在升级我们的应用程序,我们正在从 Hibernate 3.xSpring/Spring Security 3.x 迁移到 Hibernate 5.xSpring/Spring Security 5.x。我们有一些方法可以执行原生 sql 更新查询(示例 1),但是在升级到 5.x 后,这些方法开始抛出 TransactionRequiredException: Executing an update/delete query 异常。好吧,我尝试在方法上添加 @Transactional 注释,但似乎没有帮助。我将分享旧方法和升级方法(示例2)。

我不明白它在新版本上是如何不工作的,Hibernate 是否改变了他们处理原生 sql 查询的方式?感谢您的回复。

示例 1

public void myTestMethod() {
    String sql = "Update myTable set State = 1";
    Session session = getSessionFactory().openSession();
    Query query = session.createSQLQuery(sql);
    query.executeUpdate();
    session.close();
}

示例 2

public void myTestMethod() {
    String sql = "Update myTable set State = 1";
    Session session = sessionFactory.openSession();
    Query query = session.createNativeQuery(sql);
    query.executeUpdate();
    session.close();
}

我在这里做错了什么?如何在不改变方法的情况下执行此更新(我们实现了数千种方法)。示例 2 中的 sessionFactory 注入了 @Inject 注释。

【问题讨论】:

  • 您是否正确创建了所有与数据库相关的 bean?
  • @kakabali javax.persistence.transactionrequiredexception: executing an update/delete query
  • 尝试使用注释javax.transaction.Transactional 而不是org.springframework.transaction.annotation.Transactional,反之亦然,它适用于某些人
  • 您有事务管理吗?如果你在你的方法上使用@Transactional?并尝试删除行session.close();
  • 在@Transactional块中,不需要手动管理Hibernate Session

标签: java spring hibernate spring-data


【解决方案1】:

尝试在您的方法上使用@Transactional,并使用getCurrentSession() 而不是openSession()

而且您的代码有 session.close() 语句,这不再有意义,因为连接已经关闭并由 spring 管理。尝试删除 session.close() 语句并重试

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
  • 2011-03-08
  • 2018-11-01
  • 1970-01-01
相关资源
最近更新 更多