java - hibernate join fetch和二级缓存

标签 java hibernate

您好,我正在尝试将提取连接的优势与二级缓存相结合,但我正在努力实现这一点。 我有两个类,ImageMetadata 和包含图像数据字节 [] 的 ImageBlobImageMetadata 与图像 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/

相关文章:

java - Hibernate C3P0 池机制

mysql - hibernate如何处理查询语句中的like关键字

java - 如何在 EasyMocks 中测试请求对象?

java - SQLite 数据类型如何映射到 Java?

Java Commons Collections removeAll

spring - Spring 的验证例程是否支持 Hibernate 的快速失败模式的 JSR 303 实现选项?

java - 使用 Hibernate Envers 进行审计

java - 在同一 session 中更改实体管理器数据源

java - 使用Redis Spring在Redis上进行多字段查询

java - Android属性动画: how to increase view height?