Java 可以混合使用session.save和依赖于该实体的各种HQL更新吗

Java 可以混合使用session.save和依赖于该实体的各种HQL更新吗,java,hibernate,orm,Java,Hibernate,Orm,我有一个带有会话参数的函数,它在hibernate中执行各种HQL查询和HQL update语句。它们创建的sql与许多表相冲突。一次交易中的所有功能 现在我要做的是在另一个函数中,使用session.save添加此函数所依赖的一个实体,然后调用第一个函数。我担心Hibernate在执行依赖于前者的HQL查询和更新之前不会导致与session.save(myentity)关联的SQL。会话中的某种缓存和语句的重新排序 安迪 我担心Hibernate在执行依赖于session.save(myent

我有一个带有会话参数的函数,它在hibernate中执行各种HQL查询和HQL update语句。它们创建的sql与许多表相冲突。一次交易中的所有功能

现在我要做的是在另一个函数中,使用session.save添加此函数所依赖的一个实体,然后调用第一个函数。我担心Hibernate在执行依赖于前者的HQL查询和更新之前不会导致与session.save(myentity)关联的SQL。会话中的某种缓存和语句的重新排序

安迪

我担心Hibernate在执行依赖于session.save(myentity)的HQL查询和更新之前不会导致与session.save关联的SQL

文档很好地解释了导致刷新的原因:

有时会话将执行 同步所需的SQL语句 JDBC连接的状态与 保存在内存中的对象的状态。这 该过程称为flush,由 默认设置为以下几点:

  • 在执行某些查询之前
  • org.hibernate.Transaction.commit()
  • Session.flush()
SQL语句是在 顺序如下:

  • 以与相应对象相同的顺序插入所有实体 使用
    Session.save()保存
  • 所有实体更新
  • 所有集合删除
  • 所有集合元素的删除、更新和插入
  • 所有集合插入
  • 所有实体删除的顺序与相应对象的删除顺序相同 已使用会话删除。删除()
  • 例外情况是,对象使用 在以下情况下插入本机ID生成: 他们得救了

    除非您显式地
    flush()
    , 绝对没有保证 关于会话何时执行 JDBC调用,仅按 他们被处决了。然而,冬眠 是否保证
    Query.list(..)
    将永远不会返回 过时或不正确的数据

    我不知道您的函数到底在做什么,以及按照什么顺序,但文档是明确的:如果需要,执行查询将触发刷新。我不确定这是否适用于(为什么我提到订单)。但是,如果您想确定,为什么不在保存后刷新呢?

    我会多次执行session.save(obj)、query1.list()、query2.executeUpdate()、query3.list()、query4.executeUpdate()。第一个query.list()取决于看到的session.save(),第二个query.list()取决于看到的query.executeUpdate()。