簡體   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