【问题标题】:Merging the detached entity in current hibernate session without reloading it from DB在当前休眠会话中合并分离的实体而不从数据库重新加载它
【发布时间】:2015-09-16 10:19:05
【问题描述】:

我需要知道是否有一种方法可以在当前休眠会话中合并分离的实体,而无需从数据库中重新加载实体。

这里是场景:

我有一个表 CodeItem 如下所示

CodeItem
-------------------
Code      | varchar
CodeType  | varchar
Label     | varchar

pk 是由(Code, CodeType) 列组成的复合键,并且没有标识列。

DB 是 SQLServer 2012,ORM 是 hibernate 4。

已实现 Hibernate L2 缓存,它对除 CodeItem 实体之外的所有实体都运行良好。

CodeItem 实体在第一次被访问时被缓存,但当访问同一实体时,它不是从缓存中检索,而是从数据库中检索,因为身份列不存在。

对于某些限制,我无法更改表定义。 为了克服性能问题,我实现了 spring 缓存机制,效果很好。

问题是,当我从 Spring 缓存区域检索 CodeItem 实体时,我需要将它合并到休眠会话中,因为它是一个分离的实体。 为此,我使用session.merge,它将从数据库重新加载实体。

有什么方法可以在不进行数据库查询的情况下将分离的 CodeItem 实体合并到休眠会话?

我希望有这样的界面

session.merge(entity, reloadFromDBFlag)     //where reloadFromDBFlag is boolean

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    不,这是不可能的。

    如果 Hibernate 不知道其先前的(持久的)状态,它将无法检查对象中发生了什么变化(因此在刷新通过合并所做的更改时,它将无法生成正确的 SQL)。

    【讨论】:

    • 感谢您的快速回复。在我的例子中,实体永远不会改变,因为它代表只读的主数据。
    • @SarafrazSayyad 在这种情况下,不要将实体生命周期操作从其他实体级联到该实体并将其用作分离的实体。但是,我会将其用作临时快速修复,并会尽快转为使用 L2 缓存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 2010-12-19
    相关资源
    最近更新 更多