Java 惰性字段总是被加载

Java 惰性字段总是被加载,java,postgresql,hibernate,Java,Postgresql,Hibernate,我有多对一关系的课程。当我使用Criteria.list查询它们时,将填充惰性字段 public class SE { @OneToMany(fetch = FetchType.LAZY, mappedBy = "mSe") private List<RS> mRs; } public class RS { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "my_join_id")

我有多对一关系的课程。当我使用Criteria.list查询它们时,将填充惰性字段

public class SE {

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "mSe")
    private List<RS> mRs;
}

public class RS {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "my_join_id")
    private SE mSe;
}
公共类SE{
@OneToMany(fetch=FetchType.LAZY,mappedBy=“mSe”)
私人名单夫人;
}
公共类{
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“我的加入id”)
私人小型企业;
}

Criteria=session.createCriteria(SE.class);
List myObjects=criteria.List();
//SE对象已填充惰性列表。为什么?

如何防止惰性字段被加载?

您如何知道它已被填充

如果您正在使用调试器进行查看,这是一种正常的行为,因为调试器会做很多事情,并且大多数情况下会调用getter来获得实例的字符串表示。由于调用了getter,因此会触发延迟加载


要确保它确实是延迟加载的,您可以删除
@Transactional
注释,并且在调试器中尝试访问
SE
时应该会出错。

您如何知道它已填充

如果您正在使用调试器进行查看,这是一种正常的行为,因为调试器会做很多事情,并且大多数情况下会调用getter来获得实例的字符串表示。由于调用了getter,因此会触发延迟加载


要确保它确实是延迟加载的,您可以删除
@Transactional
注释,并且在调试器中尝试访问
SE
时应该会出错。

您如何知道它们已填充?当您运行
criteria.list()
时,查询是什么?如果您运行一个查询,即获取数据,它们不应该被填充吗?criertia如本文所示。也许我误解了懒加载。我假设除非在事务仍在进行时使用访问器明确加载字段,否则不会加载这些字段。我可以通过在事务结束后查看调试器来判断是否加载了惰性列表。在查看将触发加载的调试器时。另外,您是否确定事务已停止且会话已关闭?tx结束并不意味着(一定)会话已关闭,尤其是在视图模式中使用开放会话时。列表是一个代理。一旦您尝试通过调试器或代码访问它,代理将触发查询并加载列表内容。您如何知道它们已填充?当您运行
criteria.list()
时,查询是什么?如果您运行一个查询,即获取数据,它们不应该被填充吗?criertia如本文所示。也许我误解了懒加载。我假设除非在事务仍在进行时使用访问器明确加载字段,否则不会加载这些字段。我可以通过在事务结束后查看调试器来判断是否加载了惰性列表。在查看将触发加载的调试器时。另外,您是否确定事务已停止且会话已关闭?tx结束并不意味着(一定)会话已关闭,尤其是在视图模式中使用开放会话时。列表是一个代理。只要您尝试通过调试器或代码访问它,代理就会触发查询并加载列表内容。
Criteria criteria = session.createCriteria(SE.class);    
List<SE> myObjects = criteria.list();

// SE objects have lazy list populated. why?