提问者:小点点

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


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

@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;
}

因此,我被迫将惰性字段打印到跟踪日志中,这样它就不会扰乱生产日志。这样做将确保在分离实体之前预先填充惰性字段:

LOG.trace(u.getEmails().toString());

但是,此解决方案一点也不漂亮。有没有更好的方法可以做到这一点?

我不想将该字段标记为EAGER,因为我有另一个服务方法,为了提高效率,它故意跳过关系。


共2个答案

匿名用户

因为您使用的是Hibernate,所以这可能必须是特定的。我不知道有任何JPA功能可以做到这一点。根据Hibernate文档:

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

这将防止编译器擦除该调用,并消除对返回值进行某种操作以欺骗编译器的需要。因此,<code>Hibernate.initialize(u.getEmails())</code>应该适合您。

匿名用户

Hibernate初始化(u.getEmails())