Hibernate 不会初始化代理
Hibernate won't initialize proxy
我在 Hibernate 中得到了这个映射(通过 JPA,使用 EntityManager 等):
public ChildClass {
....
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parentClassId")
private ParentClass parentClass;
....
}
父级 class 具有 ChildClass
个元素的列表:
public ParentClass {
...
@OneToMany(mappedBy = "parentClass", fetch = FetchType.LAZY)
private List<ChildClass> childElements;
...
}
现在我的服务层有了这个方法:
@Transactional
public ChildClassDTO consultarPuntuacionPrueba(Long parentClassId) {
ChildClass result= childClassDAO.getChildClassByParentId(parentClassId);
ParentClass parentClass = result.getParentClass();
System.out.println("UNITIALIZED: " + ((HibernateProxy)prueba).getHibernateLazyInitializer().isUninitialized());
Long parentClassId = parentClass.getParentClassId();
Boolean anAttribute = parentClass.getBooleanAttribute();
return map(result, ChildClassDTO.class);
}
问题是 -- parentClass 是一个 javassist 代理,即使在访问 parentClass
的 getter 时,我也可以看到一个查询正在执行(它显示在我的控制台中),代理永远不会被初始化并且所有属性都为空...我已经尝试直接对我的数据库进行查询,并且它return是预期的数据。
我知道当我调用 childClass.getParentClass()
时 Hibernate 必须 return 一个代理,但为什么它之后从未初始化过?
正如您在映射中定义的那样,Hibernate 延迟加载映射的实体。这意味着映射实体仅在您访问它时加载(否则您只有一个代理实例)。因此,如果您希望映射实体被急切加载(没有代理),您可以将 FetchType 更改为 EAGER
确保您的实体 getter 和 setter 没有使用 final
关键字,否则代理将无法覆盖这些方法并且可能无法正常工作。
我在 Hibernate 中得到了这个映射(通过 JPA,使用 EntityManager 等):
public ChildClass {
....
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parentClassId")
private ParentClass parentClass;
....
}
父级 class 具有 ChildClass
个元素的列表:
public ParentClass {
...
@OneToMany(mappedBy = "parentClass", fetch = FetchType.LAZY)
private List<ChildClass> childElements;
...
}
现在我的服务层有了这个方法:
@Transactional
public ChildClassDTO consultarPuntuacionPrueba(Long parentClassId) {
ChildClass result= childClassDAO.getChildClassByParentId(parentClassId);
ParentClass parentClass = result.getParentClass();
System.out.println("UNITIALIZED: " + ((HibernateProxy)prueba).getHibernateLazyInitializer().isUninitialized());
Long parentClassId = parentClass.getParentClassId();
Boolean anAttribute = parentClass.getBooleanAttribute();
return map(result, ChildClassDTO.class);
}
问题是 -- parentClass 是一个 javassist 代理,即使在访问 parentClass
的 getter 时,我也可以看到一个查询正在执行(它显示在我的控制台中),代理永远不会被初始化并且所有属性都为空...我已经尝试直接对我的数据库进行查询,并且它return是预期的数据。
我知道当我调用 childClass.getParentClass()
时 Hibernate 必须 return 一个代理,但为什么它之后从未初始化过?
正如您在映射中定义的那样,Hibernate 延迟加载映射的实体。这意味着映射实体仅在您访问它时加载(否则您只有一个代理实例)。因此,如果您希望映射实体被急切加载(没有代理),您可以将 FetchType 更改为 EAGER
确保您的实体 getter 和 setter 没有使用 final
关键字,否则代理将无法覆盖这些方法并且可能无法正常工作。