非抽象对象上的JPA Lazy Load

时间:2014-03-20 18:47:48

标签: java hibernate jsp servlets jpa

我正在努力调整'我的应用程序,也许可以加快一点点。我使用hibernate作为我的JPA实现,并且我有一个名为Product的实体。它由名称,描述,id和图像组成,在类定义中表示为byte []。

在Web层一侧',我有一个servlet(ProductServlet),其GET方法熄灭并从数据库中检索所有Product对象的List,将它们作为属性放入请求中,并且转发到JSP,产品显示在表中。

为了显示图像,(基于我在将JSP []数据显示为JSP中的图像时发现的一些建议)我有一个单独的servlet(ImageServlet),其GET方法返回产品的JPG编码图像, ID已传入。

我的问题是,是否有一种方法可以让图像(byte [])延迟加载',这样当我向ProductServlet发出初始请求时,返回的产品列表是我没有检索图像(byte [])属性,直到我明确调用product.getImage()(我假设“懒惰负载如何工作”)。

这样,对后端数据库的初始调用以获取产品列表更快,因为没有返回所有byte []数据,然后当我需要获取时只得到byte []图像部分图像(使用ImageServlet)。

我试图在我的byte [] image属性上设置lazy fetch属性,但它说不允许,我猜测因为它是标准的Java类,而不是我的抽象类定义自己。

1 个答案:

答案 0 :(得分:1)

在JPA 2中,您将列标记为@Basic(fetch=FetchType.LAZY)。如果是JPA 1,您可以创建一个SimpleProduct实体,该实体仅包含没有图像的基本信息。但请注意,即使您的数据库没有返回列值(它不在select子句中),也要从磁盘中读取它。这笔费用。

而不是我将离开第一步。加载完所有产品后,我会将图像放入缓存(您可以使用简单的Guava cache),ImageServlet应该从缓存中读取。使它成为一个短生命缓存(如15秒),并提供一个加载器,以防图像不是以某种方式在缓存中,然后命中数据库。

相关问题