[英]Programmatically Fetching a Lazy JPA Field
我的实体中有一个延迟获取的字段
@ElementCollection(fetch = LAZY)
private List<String> emails;
而且我的事务边界在服务类处停止,我不想在渲染视图时使其保持打开状态。 我希望我的服务类返回分离的实体。
在我的服务类中,我尝试调用getter,但似乎已被编译器抹去了-也许这是对似乎什么都不做的语句的优化
/* User Service class */
@Transactional
public List<User> getAllUsers() {
List<User> users = new ArrayList();
for(User u : userRepo.findAll()) {
u.getEmails(); // <-- this seem to be erased by the compiler optimization.
users.add(u);
}
return users;
}
因此,我不得不将惰性字段打印到TRACE日志中,以免混乱生产日志。 这样做将确保在分离实体之前预先填充惰性字段:
LOG.trace(u.getEmails().toString());
但是,这种解决方案一点也不漂亮。 有什么更好的方法吗?
我不想将字段标记为EAGER,因为我有另一种服务方法有意跳过关系以提高效率。
Hibernate.initialize(u.getEmails())
由于您正在使用Hibernate,因此这可能必须是特定的。 我不知道执行此操作的任何JPA功能。 根据休眠文档 :
静态方法
Hibernate.initialize()
和Hibernate.isInitialized()
为应用程序提供了处理延迟初始化的集合或代理的便捷方法。 只要其Session仍处于打开状态,Hibernate.initialize(cat)
将强制初始化代理cat。Hibernate.initialize( cat.getKittens() )
对于收集小猫具有类似的效果。
这应该防止编译器擦除该调用,并消除您需要对返回值进行某种工作来欺骗编译器的需要。 因此, Hibernate.initialize(u.getEmails())
应该适合您。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.