即使将集合声明为Lazy,它们也会被加载

|
@Entity 
public class User {

    @ManyToMany(cascade = { MERGE, PERSIST, CascadeType.REFRESH }, fetch = LAZY)
    @Cache(usage = READ_WRITE)
    @UserRoles
    private List<Role> roles = new ArrayList<Role>(0);

}
即使集合被声明为惰性,集合也会被加载,这可能是即使声明为惰性的集合也会被加载的原因     
已邀请:
根据JPA 2.0规范,延迟获取是对持久性提供程序的提示。 第11.1.6节说:   EAGER策略是   持久性提供程序运行时   必须热切地获取数据。懒人   策略是持久性的暗示   提供程序运行时数据应为   第一次懒洋洋地拿   访问。实现是   允许急切地获取数据   LAZY策略提示是   指定。 在某些情况下,提供程序可能会确定懒惰地获取某些内容是没有意义的,或者,也许提供程序甚至可能没有实现延迟获取。 PersistenceUtil.isLoaded方法可用于确定实体的加载状态 及其属性,无论与实体关联的持久性单元如何。 为确保您遇到此类问题,应使用此方法。当然,如果一个实体脱离了,则对懒散获取的字段进行简单检查也可能会有所帮助。 除此之外,基于发布的代码为什么我的收藏夹没有被延迟获取,我看不到特定的原因。我认为在这种情况下,您正在使用二级缓存的事实可能会受到影响,但这是我尚未验证的事情,这只是预感。 [EDIT-1] 如果您使用的是最终类,则延迟加载也存在问题。 Hibernate文档在持久化类下说:   Hibernate的主要功能是   代理,取决于持久性   类不是最终的,或者   接口的实现   声明所有公共方法。      您可以坚持这样做的最终课程   没有实现与   冬眠。但是,您不会   能够使用代理进行懒惰   关联获取   最终限制您的选择   性能调优。      您还应该避免宣布公开   非决赛的最终方法   类。如果你想上课   使用公开的最终方法,您必须   通过设置明确禁用代理   lazy = \“ false \”。 [EDIT-2] 除此之外,JPA 2.0规范第2.1节还指定实体不得为最终实体:   实体类不能是最终的。没有   方法或持久实例   实体类的变量可能是   最后 稍后在2.5节中针对可嵌入对象指定了相同的要求。 我没有访问JPA 1.0规范的权限,但是我非常有信心这一要求也适用于它。尝试一下,看看这是否是原因,然后告诉我们。     

要回复问题请先登录注册