如何解决即使将集合声明为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规范的权限,但是我非常有信心这一要求也适用于它。尝试一下,看看这是否是原因,然后告诉我们。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。