Java 休眠延迟加载不工作

Java 休眠延迟加载不工作,java,hibernate,jpa,jpa-2.0,Java,Hibernate,Jpa,Jpa 2.0,我使用的是3.6.1.Final版本 我的实体bean中有以下属性 @JoinColumn( name = "FOLDER_PARENT_ID", referencedColumnName = "FOLDER_ID" ) @ManyToOne(cascade=CascadeType.MERGE, fetch= FetchType.LAZY ) private FolderTbl parent; 在我的单元测试中,Assertnull失败,因为getParent()不是null asse

我使用的是3.6.1.Final版本

我的实体bean中有以下属性

    @JoinColumn( name = "FOLDER_PARENT_ID", referencedColumnName = "FOLDER_ID" )
@ManyToOne(cascade=CascadeType.MERGE, fetch= FetchType.LAZY )
private FolderTbl parent;
在我的单元测试中,Assertnull失败,因为getParent()不是null

assertNull( folderTbl.getParent() );

我还需要做什么才能停止休眠加载父级?

父级配置正确要延迟加载,关键是测试错误

当您调用方法
getParent()
时,Hibernate将加载该对象,当对实际对象的请求到来时,它将加载该对象


您可以通过将
show\u sql
配置为true来检查这一点。当您调用
getParent()

时,它将调用一个查询,即使您将lazy设置为true,父值也不会为null。延迟加载使用代理对象并将其指定给父属性。当我们尝试使用父对象(调用
getParent()
)时,它将使用代理对象加载实际的父对象


如果不想加载对象,请不要为该项配置JPA属性并将其设置为瞬态。

对于某些情况,您可能根本不需要加载惰性集合。您可以使用如下方法将集合与会话分离

public class. .... {
.....
  @JoinColumn( name = "FOLDER_PARENT_ID", referencedColumnName = "FOLDER_ID" )
  @ManyToOne(cascade=CascadeType.MERGE, fetch= FetchType.LAZY )
  private FolderTbl parent;
  ...
  public void detachLazyObjects() {
     parent = null;
  }

然后调用此方法将类从需要它为null的位置分离出来。请谨慎使用此快捷方式,我建议您在使用此解决方案之前考虑其他方法。

事实上,调用getParent()可能会返回一个代理实例,表明存在父实例。 如果访问id以外的字段,则在必要时将加载父项

请注意,父级可能已经由事务加载,因此驻留在一级缓存中。如果是这样,Hibernate通常不会对数据库进行另一次查询


如前所述,如果您的实体具有对父对象的非瞬态引用,则getParent()将始终返回非空值,即使父对象本身尚未加载。

Hibernate将延迟抓取视为提示。以下是JPA2.0规范在第364页表9中的说明

(可选)字段或属性的值 应该延迟加载,或者必须急切地获取。这个 渴望策略是持久性提供者的一项要求 运行时,必须立即获取该值。这个 惰性策略是对持久性提供程序运行时的提示


谢谢你的解释。我现在理解了检查您的日志是否有“恢复实体类[class xxx.xxx.xx]的OneToOne或ManyToOne属性[xxxxx]上的惰性设置”,因为未启用或未发生编织。