繁体   English   中英

以编程方式获取惰性JPA字段

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM