【问题标题】:hibernate join fetch and second-level cachehibernate join fetch和二级缓存
【发布时间】:2017-08-10 08:34:05
【问题描述】:

您好,我正在尝试将 fetch join 的好处与二级缓存相结合,但我正在努力实现这一点。 我有两个类,ImageMetadataImageBlob,其中包含一个字节 [] 的图像数据。 ImageMetadata 具有与 Image blob 的 OneToOne 关联。在我的应用程序中,我有时只想加载元数据,有时还想加载 ImageBlob 数据。

我尝试了 2 种类型的映射: 1. 渴望加载和缓存ImageBlob

@Entity
class ImageMetadata {
 // various simple fields and ID omitted for brevity
@OneToOne(optional=false)
private ImageBlob blob;
}

@Entity
@Cache(usage=CacheConcurrencyStrategy.READ)
class ImageBlob {
 @Lob
 private byte [] data;   
 //id omitted for brevity
}

如果我调用 session.get(imageMetadataId),图像 blob 现在总是通过默认的 EAGER 获取策略加载,即使不需要它,但在第一次加载后,它会从二级缓存中获取。

因此,方法 2 是将关联标记为 LAZY,这样我就不会在不需要时获取 ImageBlob,而是在需要时发出查询 from ImageMetadata i left join fetch i.blob where i.id=?。但在这种情况下,永远不会从二级缓存中检索 ImageBlob。

是否可以两全其美? IE。保持惰性关联,还受益于二级缓存?

感谢您的建议。

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    不,

    在情况 1 中,Hibernate 在加载 ImageMetadata

    时总是会加载 blob

    在情况 2 中,Join Fetch 将始终从数据库服务器中检索数据。

    最好的方法是使用 LAZY 而不结合“join fetch”。

    每当您的应用程序调用 getBlob() 方法时,Hibernate 将尝试从缓存中获取它(第一次和第二次)如果缓存没有它,Hibernate 将查询 DB 并将其放入缓存中(同样是第一次和第二次)重复调用将从缓存(第一个或第二个)中检索具有相同 ID。

    【讨论】:

    • 好的,谢谢,应用程序在分离的 ImageMetadata 对象上调用 getBlob(),但根据您的回复,我认为最好有 2 个服务级别方法,其中一个调用 getBlob()初始化它,一个没有。谢谢!
    猜你喜欢
    • 2013-08-20
    • 2014-11-28
    • 2011-12-18
    • 2012-12-12
    • 2015-05-14
    • 2016-03-24
    • 2011-05-09
    • 2010-11-16
    • 1970-01-01
    相关资源
    最近更新 更多