【问题标题】:Why the fetch=FetchType.LAZY directive don't work when I retrieve an object using Hibernate?为什么当我使用 Hibernate 检索对象时 fetch=FetchType.LAZY 指令不起作用?
【发布时间】:2016-01-03 14:05:51
【问题描述】:

我是 JPA 和 Hibernate 的新手,遇到以下问题。

Spring MVC 项目中,我有这个 Tid001Anagpartecpa 模型类,它映射数据库中定义的 TID001_ANAGPARTECIPA 表上的字段: p>

@Entity
@Table(name="TID001_ANAGPARTECIPA")
@NamedQuery(name="Tid001Anagpartecipa.findAll", query="SELECT t FROM Tid001Anagpartecipa t")
public class Tid001Anagpartecipa implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="PRG_PAR")
    private Integer prgPar;

    ................................................................
    ................................................................
    ................................................................

    @Lob @Basic(fetch=FetchType.LAZY)
    @Column(name="OGG_DOC_ALL")
    private byte[] oggDocAll;


    @Lob @Basic(fetch=FetchType.LAZY)
    @Column(name="OGG_DOC_DEL_ALL")
    private byte[] oggDocDelAll;

    ................................................................
    ................................................................
    GETTER & SETTER METHODS
    ................................................................
    ................................................................
}

正如您在此表中看到的那样,有 2 个 BLOB 字段使用 @Lob 注释进行注释,这些字段包含存储在数据库中的 2 个文件。

在这个类中还声明了这个命名查询,它检索存储为 TID001_ANAGPARTECIPA 表记录的所有 Tid001Anagpartecipa 对象:

正如您在前面的代码截图中看到的那样,@Lob 字段使用了 lazy 策略(通过 @Basic(fetch=FetchType.LAZY))。所以我预计当我检索 Tid001Anagpartecpa 对象时,这 2 个 @Lob 字段不会被初始化。

在控制器方法中,我执行检索 Tid001Anagpartecpa 对象的操作:

Tid001Anagpartecipa anagrafica = getAnagraficaPartecipante(model);
List<Tid002Candidatura> listaCandidatureDB = anagrafica.getTid002Candidaturas();

对象已正​​确检索,但问题是前 2 个 @Lob 字段已初始化,我希望这些字段未初始化(实际上我使用了 @Basic(fetch= FetchType.LAZY) 指令)。

为什么要检索这些字段?我错过了什么?当检索到 Tid001Anagpartecpa 时,如何让 Hibernate 不检索这些 @Lob 字段?

Tnx

【问题讨论】:

    标签: spring hibernate jpa spring-data hibernate-mapping


    【解决方案1】:

    懒惰是什么意思?这意味着事情是按需加载的。有两种方法可以实现:使用代理(拦截代理中的调用并加载事物)或通过字节码增强(修改实体类的字节码,以便拦截惰性访问)。

    由于您无法为byte[] 制作代理,因此第二种方法是唯一符合条件的方法。

    但是,您可以将 lob 提取到单独的延迟加载实体中,如 here 所述。

    【讨论】:

      【解决方案2】:

      JPA 规范第 11.1.6 节关于 @Basic 注释的说明:

      LAZY 策略是对持久性提供程序运行时的提示, 首次访问数据时应延迟获取数据。这 允许实现急切地获取 LAZY 的数据 已指定策略提示。

      Hibernate确实支持简单属性的延迟加载,但需要增强字节码才能这样做:

      http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.html#performance-fetching-lazyproperties

      没有这个:

      如果您的持久类没有得到增强,Hibernate 将忽略 惰性属性设置并返回立即获取。

      【讨论】:

      • 什么都没有。您需要更改构建过程以增强类。如果使用 maven 和 hibernate >=4.2.8,那么你应该能够使用 pom.xml 的相关插件。请参阅此处的“hibernate-enhance-maven-plugin”部分dzone.com/articles/hibernate-bytecode-enhancement
      猜你喜欢
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 2020-03-27
      • 2020-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多