您好我正在尝试将fetch连接的优势与二级缓存结合起来,但我正在努力实现这一目标。
我有两个类ImageMetadata
和ImageBlob
,其中包含一个byte []图像数据。 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),现在总是通过默认的EAGER提取策略加载Image blob,即使它不需要,但是在第一次加载后,它从第二级缓存中获取。
因此,方法2是将关联标记为LAZY,这样我就不会在不需要时获取ImageBlob,但只要我确实需要它,就发出查询{{1} }。但在这种情况下,永远不会从二级缓存中检索ImageBlob。
是否有可能充分利用两个世界?即保持懒惰的关联,并从二级缓存中受益?
感谢您的任何建议。
答案 0 :(得分:1)
没有
在案例1中,只要加载 ImageMetadata
,Hibernate将始终加载 blob在案例2中,Join Fetch将始终从数据库服务器检索数据。
最好的方法是使用LAZY而不与“join fetch”结合使用。
每当你的应用程序调用getBlob()方法时,Hibernate会尝试从缓存中获取它(第一个和第二个)如果缓存没有它,Hibernate将查询数据库并将其放入缓存(同样是第一个和第二个)重复调用将从缓存(第一或第二)中检索具有相同ID的内容。