当我使用Hibernate检索对象时,为什么fetch = FetchType.LAZY指令不起作用?

时间:2015-10-06 15:18:28

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

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

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

@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)< /强>)。所以我希望当我检索 Tid001Anagpartecipa 对象时,这2个 @Lob 字段不会被初始化。

进入控制器方法我执行此操作以检索 Tid001Anagpartecipa 对象:

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

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

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

TNX

2 个答案:

答案 0 :(得分:1)

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

  

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

Hibernate 支持支持延迟加载简单属性,但需要字节码增强才能执行此操作:

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

没有这个:

  

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

答案 1 :(得分:0)

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

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

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