【问题标题】:Lazyinitialization exception when loading a hibernate object from ehcache从 ehcache 加载休眠对象时出现延迟初始化异常
【发布时间】:2016-02-25 18:47:58
【问题描述】:

我将休眠实体存储在 ehcache 中。当调用外观层以检索实体时,我的拦截器将调用该方法并将其缓存。下次调用相同的方法时,实体将从缓存中返回。这一切都很好。

我的实体有一些定义为 FetchType.Lazy 的属性(对象或关联实体)。是这样的,

@JoinColumn(name = "inventory_item_oid", referencedColumnName = "inventory_item_oid")
@ManyToOne(fetch = FetchType.LAZY)
private InventoryItem inventoryItem;

因此,并非所有属性都已加载。当需要库存项目时,它会被调用。此调用引发 LazyInitialization 异常。

由于我的缓存值仅存在一天,因此可以在过期之前调用任意次数。

其中一个调用引发了上述异常。

我发现使用长休眠会话可以解决这个问题。但它不起作用,因为我的是基于请求/响应的应用程序。

还有另一种方法,我需要在访问其属性之前检查 InventoryItem 是否为空,如果为空,则我需要单独获取该值并将其附加到父项。这似乎很好......但需要大量工作,因为我有很多实体。

我想知道是否有任何其他方法可以获取那些定义为惰性的对象。

【问题讨论】:

    标签: hibernate caching ehcache entities lazy-initialization


    【解决方案1】:

    您不应该自己在 EHCache 中缓存实体。相反,您应该将 Hibernate 配置为使用二级缓存,并使用 EHCache 作为其实现。

    最终结果将是相同的:您的实体将被缓存,并且您将往返保存到数据库。但是通过使用二级缓存,一切都将是透明的:您将从会话中加载实体,而 Hibernate 会自动将它们存储在缓存中。如果您从会话中重新加载它们,Hibernate 将从缓存中获取它们。如果您更新实体,它将从缓存中逐出,以确保下次重新加载新副本。

    与您的手工解决方案的另一个巨大区别是 Hibernate 将返回您附加实体。因此,如果您只是调用 cachedEntity.getNonCachedEntity(),Hibernate 将延迟加载非缓存实体,就像您根本没有缓存一样。

    实体是来自数据库还是来自二级缓存都不会改变任何东西:如果一个属性是延迟加载的,并且如果该属性在会话关闭后被访问,那么延迟属性必须被初始化在会话关闭之前。

    调用Hibernate.initialize(foo.getInventotyItem())进行初始化。

    更多信息请关注Hibernate documentation

    【讨论】:

    • "如果在会话关闭后访问此属性,则必须在会话关闭之前初始化惰性属性"。我怎么知道第一次检索该对象将在会话外使用?!您的建议就像每次都初始化检索到的缓存对象,以确保这完全破坏了使用惰性属性的优势。
    • 你不需要在检索时初始化惰性属性。如果您打算在之后访问它,您必须确保在关闭会话之前对其进行初始化。解决此问题的最简单方法是在会话关闭后不访问任何属性(即仅在您完成使用实体后关闭它,例如使用 open-session-in-view 过滤器),或者避免在会话关闭后使用实体(例如,通过将实体转换为 DTO)
    • 好的,这是一个测试。我第一次调用存储库方法,并缓存了带有惰性未初始化道具的结果。话题结束了。在另一个线程中,我调用相同的方法并在尝试读取这些道具时得到 Lazy Exception。为什么我需要做一些额外的工作(即显式打开会话)而不是将其委托给缓存软件?缓存配置可能还有一个决定吗?
    • 提出您自己的问题,并附上相关解释、相关代码、您期望发生的事情以及发生的事情。
    • 我认为与当前问题相比没有任何区别。作者只是没有向我们展示缓存配置和/或缓存方法的确切注释。对我来说,很明显这种情况很普通。如何告诉 ehcache 自己解决这个问题而无需额外的编码? :)
    猜你喜欢
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多