Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hibernate连接获取和二级缓存_Java_Hibernate - Fatal编程技术网

Java hibernate连接获取和二级缓存

Java hibernate连接获取和二级缓存,java,hibernate,Java,Hibernate,您好,我正在尝试将fetch连接的优点与二级缓存结合起来,但我很难做到这一点。 我有两个类,ImageMetadata,和ImageBlob,其中包含一个字节[]的图像数据ImageMetadata与图像blob有一个OneToOne关联。在我的应用程序中,我有时只想加载元数据,有时还要加载ImageBlob数据 我尝试了两种类型的映射: 1.即时加载和缓存ImageBlob @Entity class ImageMetadata { // various simple fields and

您好,我正在尝试将fetch连接的优点与二级缓存结合起来,但我很难做到这一点。 我有两个类,
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现在总是通过默认的急切获取策略加载,即使不需要它,但在第一次加载之后,它会从二级缓存中获取

因此,方法2是将关联标记为LAZY,这样我就不会在不需要ImageBlob的时候获取它,但只要我确实需要它,就可以从ImageMetadata发出查询
,我留下了join fetch I.blob,其中I.id=?
。但在这种情况下,永远不会从二级缓存检索ImageBlob

有可能做到两全其美吗?也就是说,保持惰性关联,并从二级缓存中获益

谢谢你的建议。

在案例1中,Hibernate在加载ImageMetadata时总是加载blob

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

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


每当你的应用程序调用getBlob()方法时,Hibernate都会尝试从缓存(第1和第2个)中取出它。如果缓存中没有,Hibernate会查询DB并将其放入缓存(第1和第2个)。将从缓存(第1或第2个)中检索具有相同id的重复调用。

好的,谢谢,应用程序正在调用getBlob()在分离的ImageMetadata对象上,但根据您的回答,我认为最好有两个服务级别方法,一个调用getBlob()对其进行初始化,另一个不调用。谢谢