【问题标题】:Do I have to refresh entities after bulk updates / deletes with HQL?使用 HQL 批量更新/删除后,我是否必须刷新实体?
【发布时间】:2015-01-03 11:17:00
【问题描述】:

我已经编写了一些使用 HQL 进行批量更新/删除的 DAO 方法,但我发现当执行查询时,内存中的实体没有同步(缓存没有更新)。

说,我有一个项目集合,每个项目都有一个组集合,我想删除所有组。我可以迭代组并删除每个组,但我更喜欢使用 HQL 和 IN 运算符运行批量删除。但是,执行查询后,列表中有旧对象。

我意识到我必须使用 session.refresh() 刷新对象。有没有其他方法可以自动批量更新和更新缓存?

【问题讨论】:

    标签: c# caching nhibernate hql updates


    【解决方案1】:

    答案是否定的。如此处所述:

    13.3. DML-style operations

    引用:

    ...如前所述,自动和透明的对象/关系映射与对象状态的管理有关。 这意味着对象状态在内存中可用,因此进行操作 (使用 SQL 数据操作语言 (DML) 语句:INSERT、UPDATE、DELETE) em> 直接在数据库中的数据不会影响内存状态。然而,NHibernate 提供了用于批量 SQL 样式 DML 语句执行的方法,这些语句通过 Hibernate 查询语言 (HQL) 执行...

    DML 可以帮助我们跳过内存中的状态管理...从 SQL 语句的角度来看更高效。但这意味着:

    直接在数据库中操作...数据不会影响内存状态

    【讨论】:

    • 我正在使用 HQL 而不是 SQL 进行批量操作。但是,对象的内存状态再次不受影响。
    • HQL 就是我在这里所说的。不是 SQL。 DML 操作是关于 HQL 的,它们无法在内存会话中连接
    • 嗯。有没有其他方法可以在不使用 HQL 的情况下执行批量保存或更新?在记忆状态是我想要支持的东西......
    • 好吧,您很可能应该阅读文档中的某些部分,例如Contextual session 以及我的回答中提到的 DML。经过一番阅读,您应该明白,要么有会话管理,要么有与更改/脏实体相关的一一插入/更新语句。这可以在 ADO.NET 级别上批量(某种批量)。请参阅this answer 和 cmets。但 DML 是另一回事。与会话无关。非此即彼。现在有用吗?
    • 是的,它是一个很棒的工具。我希望将来 NHibernate 的人们能够创造出类似以下的东西:blogs.telerik.com/openaccessteam/posts/13-06-24/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多