【问题标题】:How do I refresh hibernate object after changes made by stored procedure存储过程进行更改后如何刷新休眠对象
【发布时间】:2013-07-19 03:40:58
【问题描述】:

在我的 grails 应用程序中,我们正在调用一个可能更新数千条记录的存储过程。在存储过程调用之后,我需要将其中许多记录以 json 格式发送回 UI。但是,在存储过程完成后,休眠继续查看旧对象。我已经在每个对象上尝试了 evict() 并使用 HQL 再次加载这些对象,但无济于事。

解决这个问题的最佳方法是什么。

【问题讨论】:

    标签: java hibernate grails stored-procedures grails-orm


    【解决方案1】:

    答案在于问题。 :) 使用refresh()。参考this

    如果您想完全清除休眠会话,则可以使用session.clear()。请参阅clear。 为此,您需要获取当前会话,您可以通过两种方式进行操作:

    1. 获取sessionFactory,获取当前会话并清除它。 grailsApplication.mainContext.sessionFactory.currentSession.clear()

    2. 使用withSession 闭包。

      DomainABC.withSession{s-> s.clear()}

    【讨论】:

    • 我至少有数百个使用 HQL 加载的对象,并且不想在每个对象上单独迭代和运行 refresh()。应该有办法从休眠会话/缓存中清除所有对象。
    • @user593644 查看答案的更新。您可以使用clear 清除会话。
    • refresh() 和 session.clear() 对我不起作用。我尝试运行本机查询来获取数据,我认为在直接从数据库获取数据方面比 HQL 查询执行得更好。但是,即使这样也有超过 25% 的失败率。然后我在获取数据之前添加了session.flush();session.clear();Thread.sleep(2000);。现在,它似乎工作正常,尽管我不知道为什么会这样?我不希望 groovy.sql.Sql.execute() 是异步的。我很困惑。
    猜你喜欢
    • 1970-01-01
    • 2012-12-06
    • 2019-11-14
    • 1970-01-01
    • 2012-07-04
    • 2011-01-25
    • 2012-08-09
    • 2015-12-11
    相关资源
    最近更新 更多