hibernate join fetch和二级缓存

时间:2017-03-18 21:53:35

标签: java hibernate

您好我正在尝试将fetch连接的优势与二级缓存结合起来,但我正在努力实现这一目标。 我有两个类ImageMetadataImageBlob,其中包含一个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。

是否有可能充分利用两个世界?即保持懒惰的关联,并从二级缓存中受益?

感谢您的任何建议。

1 个答案:

答案 0 :(得分:1)

没有

在案例1中,只要加载 ImageMetadata

,Hibernate将始终加载 blob

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

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

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