您好,我正在尝试将提取连接的优势与二级缓存相结合,但我正在努力实现这一点。
我有两个类,ImageMetadata
和包含图像数据字节 [] 的 ImageBlob
。 ImageMetadata
与图像 blob 具有 OneToOne 关联。在我的应用程序中,有时我只想加载元数据,有时也加载 ImageBlob 数据。
我尝试了两种类型的映射: 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,而是在需要时从 ImageMetadata 发出查询 i left join fetch i .blob 其中 i.id=?
。但在这种情况下,永远不会从二级缓存中检索 ImageBlob。
是否有可能两全其美? IE。保持惰性关联,也受益于二级缓存?
感谢您的任何建议。
最佳答案
没有,
在情况 1 中,Hibernate 将始终在加载 ImageMetadata 时加载 blob
在情况 2 中,Join Fetch 将始终从数据库服务器检索数据。
最好的方法是使用 LAZY,而不结合“join fetch”。
每当您的应用程序调用 getBlob() 方法时,Hibernate 将尝试从缓存中获取它(第一次和第二次)如果缓存中没有它,Hibernate 将查询 DB 并将其放入缓存(同样是第一次和第二次) 重复调用具有相同 ID 的将从缓存中检索(第一个或第二个)。
关于java - hibernate join fetch和二级缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42880321/