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

Java 以编程方式获取惰性JPA字段,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我的实体中有一个延迟获取的字段 @ElementCollection(fetch = LAZY) private List<String> emails; 然而,这个解决方案一点也不漂亮。有没有更好的办法 我不想将该字段标记为“急切”,因为我有另一种服务方法故意跳过关系以提高效率。Hibernate.initialize(u.getEmails())由于您使用的是Hibernate,这可能必须是特定的。我不知道有任何JPA功能可以做到这一点: 静态方法Hibernate.initi

我的实体中有一个延迟获取的字段

@ElementCollection(fetch = LAZY)
private List<String> emails;
然而,这个解决方案一点也不漂亮。有没有更好的办法


我不想将该字段标记为“急切”,因为我有另一种服务方法故意跳过关系以提高效率。

Hibernate.initialize(u.getEmails())
由于您使用的是Hibernate,这可能必须是特定的。我不知道有任何JPA功能可以做到这一点:

静态方法
Hibernate.initialize()
Hibernate.isInitialized()
,为应用程序提供了一种方便的方式来处理延迟初始化的集合或代理<代码>休眠。初始化(cat)将强制初始化代理cat,只要其会话仍然打开
Hibernate.initialize(cat.getKittens())
对收集小猫也有类似的效果

这将防止编译器删除该调用,并消除使用返回值欺骗编译器的需要。所以
Hibernate.initialize(u.getEmails())
应该适合您

/* 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;
}
LOG.trace(u.getEmails().toString());