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