【问题标题】:Why is Grails Searchable Plugin causing errors on Hibernate AutoFlush?为什么 Grails Searchable Plugin 会导致 Hibernate AutoFlush 出现错误?
【发布时间】:2011-03-18 14:41:25
【问题描述】:

在我尝试排除故障的Grails 1.2.5 项目中,我们使用Grails Searchable plugin .5.5.1。

问题在于,每当我们尝试索引大型集合域类时,Grails 都会不断抛出:

错误休眠.AssertionFailure - 一个 发生断言失败(这可能 指示 Hibernate 中的错误,但 更有可能是由于不安全使用 会议) org.hibernate.AssertionFailure: 集合 [域类] 不是 由flush()处理

但所涉及的域类已被hibernate 映射和使用,除了对可搜索插件的调用之外没有问题。

可搜索插件的使用如下:

  1. 使用compass.openSession() 创建一个指南针会话
  2. 开始罗盘交易:compassSession.beginTransaction()
  3. 然后在一个重要的未索引域类上调用compassSession.create(result.get(0))
  4. 最终调用compassTransaction.commit() 来提交事务。
  5. 转到 2 并处理下一个域类

在第 3 和第 4 个 Domain 类之间,触发了引发错误的自动刷新。

谁能给我任何关于如何解决这个问题的提示?

以前有人遇到过这个问题吗?

我知道他们有一个 searchable-plugin 的systemic issue with this back in pre .5 versions这些问题可能没有完全解决吗?

【问题讨论】:

    标签: hibernate grails flush autoflush searchable-plugin


    【解决方案1】:

    This article 帮助我理解了它。您必须在包含脏对象的会话中进行一些 Hibernate 查询,并且它们在修改过程中得到flush()-ed。

    有时可以在任何修改发生之前将所有只读查询移到事务之外,并在withTransaction{} 中进行修改。

    【讨论】:

    • 感谢您的链接。我实际上通过重新排序调用解决了这个问题,以便首先检索所有结果集,然后对每个结果集进行索引。在下一个结果集之前检索和索引每个结果集之前。重新排序调用可以解决问题,这有点荒谬,我称之为错误。
    • 我不会将此称为错误,只要调用实际上是同时访问相同的数据。将只读查询移出临界区是一种并发编程模式。
    • @VictorSergienko:这是一个错误,因为调用的顺序有时不应该起作用,而其他时候则不起作用,除非明确记录了原因。如果由于行为不一致而无法正常工作并且没有说明原因,那么是的,这是 IMO 的错误。
    • @Mark,你所描述的是并发编程的工作方式(或不工作)。
    • @VictorSergienko:如果你这么说的话。我认为刷新效果是延迟执行而不是并发编程,因为我们谈论的是执行延迟而不是多线程/处理。
    猜你喜欢
    • 2014-12-06
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 2021-04-08
    • 2019-09-02
    • 1970-01-01
    相关资源
    最近更新 更多