【发布时间】:2019-09-02 07:31:09
【问题描述】:
我遇到了多对多问题
@ManyToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
@JoinTable(
name = "PORTFOLIO_USER_PERMS",
joinColumns = { @JoinColumn(name = "USERNAME") },
inverseJoinColumns = { @JoinColumn(name = "PORTFOLIO_ID"), }
)
private List<Portfolio> sharedPortfolios = new ArrayList<>();
我有一种情况,其中一个 sharedPortfolios 一个元素是代理,另一个元素具有一个代理属性(由于一对一的关系,actulay 是同一个对象)。此列表通常返回到 Controller 方法,然后将其转换为相应的 DTO。您可能会怀疑,带有代理对象的单个属性会导致 LazyInitializationException。
这意味着在服务中,我需要遍历列表中的每个元素,以查找任何可能是代理和非代理的属性,使用 Hibernate 实用程序:Hibernate.unproxy(...) 之前它被传递给控制器。
我的问题:
1)Hibernate.initialize和Hibernate.unproxy有什么区别?
初始化代理对象并不能解决问题。
2) 为什么其中一个元素是代理,而其他元素不是?
3) 还有什么比手动遍历这个列表和所有属性并搜索代理对象更好的方法?
非常感谢。
最好的问候。
【问题讨论】:
-
fetch = FetchType.EAGER -
非常感谢。即使它解决了问题,它也有性能问题。除非确实有必要,否则我不需要从数据库中检索该列表。
-
您如何检索您的实体?有不同的方法可以告诉 Hibernate 急切地获取关系。例如,使用 HQL:
from Foo foo join fetch foo.sharedPortfolios where blablabla -
实际上我没有使用查询,只是 sharedPortfolios 的 getter。管理查询和列表创建的是休眠。我应该在我的 Spring JpaRepository 上创建一个方法吗?
-
那么您是如何获得包含
sharedPortfolios关系的实体的呢?那是您可以“在真正需要时”检索关系的地方