【发布时间】:2017-08-10 08:34:05
【问题描述】:
您好,我正在尝试将 fetch join 的好处与二级缓存相结合,但我正在努力实现这一点。
我有两个类,ImageMetadata 和 ImageBlob,其中包含一个字节 [] 的图像数据。 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。保持惰性关联,还受益于二级缓存?
感谢您的建议。
【问题讨论】: