我是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
答案 0 :(得分:1)
关于@Basic注释的JPA规范说明的第11.1.6节:
LAZY策略是对持久性提供程序运行时的暗示 首次访问时,应该懒散地获取数据。该 允许实现急切地获取LAZY的数据 策略提示已被指定。
Hibernate 支持支持延迟加载简单属性,但需要字节码增强才能执行此操作:
没有这个:
如果您的持久化类没有增强,Hibernate将忽略 延迟属性设置并返回立即获取。
答案 1 :(得分:0)
懒惰意味着什么?这意味着按需加载东西。有两种方法可以实现:通过使用代理(拦截代理中的调用并加载事物)或字节码增强(修改实体类的字节码,以便拦截延迟访问)。
由于您无法为byte[]
设置代理,因此第二种方法是唯一符合条件的方法。
但是,您可以将吊球提取到单独的延迟加载实体,如here所述。