hibernate - 从 ehcache 加载 hibernate 对象时出现延迟初始化异常

标签 hibernate caching ehcache entities lazy-initialization

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

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

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

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

由于我的缓存值只存在一天,因此可以在过期之前多次调用它。

这些调用之一引发上述异常。

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

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

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

最佳答案

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

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

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

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

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

更多信息请访问 Hibernate documentation .

关于hibernate - 从 ehcache 加载 hibernate 对象时出现延迟初始化异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10921790/

相关文章:

caching - azure共享缓存和新的azure redis缓存有什么区别?

optimization - Yslow 替代方案 - 针对小型网站的优化

docker - 如何删除 Travis CI 上的缓存?

hibernate - Grails/GORM,禁用一级缓存

java - 我们总是需要使用CacheManager吗?

java - 部署到 websphere 时在 hibernate 5 上使用 JPA 2.0

hibernate - Hibernate在更新时可以忽略实体成员吗?

java - JPA/Hibernate 单向 OneToMany 为 'mappedBy'

java - 使用 hibernate : psql: could not connect to server: Connection refused

java - 3.1版本如何获取EhCache的大小