gpt4 book ai didi

java - LazyCollectionOption.EXTRA 与 Spring 代理?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:46:17 24 4
gpt4 key购买 nike

我想显示一个表,其中包含我数据库的所有用户。该表还应包含用户对象中包含的列表的元素数。因为我只需要大小/数量,所以我想阻止获取整个列表。因此,我正在使用 LazyCollectionOption.EXTRA,文档说明:

EXTRA = .size() and .contains() won't initialize the whole collection

但以下仍然不起作用:

@Entity
class User {
@OneToMany
@LazyCollection(LazyCollectionOption.EXTRA)
List<Transaction> transactions;
}

当我调用 user.getTransactions().size() 时,结果是:

Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: User.transactions, could not initialize proxy - no Session at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:575) at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:214) at org.hibernate.collection.internal.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:155) at org.hibernate.collection.internal.PersistentBag.size(PersistentBag.java:278)

最佳答案

即使 @LazyCollection(LazyCollectionOption.EXTRA) 不是给您带来麻烦的原因,如果您关心应用程序性能,you shouldn't be using EXTRA lazy fetching anyway .

我认为您正在 Hibernate session 中获取用户列表,该 session 在您想要访问用户的事务之前关闭。

这是 LazyInitializationException 的典型场景,因为当 Session 仍处于打开状态时嵌套集合尚未初始化。

获取所有用户及其所有交易会得到笛卡尔积,这会导致性能问题。

我认为获取用户列表并使用子选择提取来检索事务很好:

@OneToMany
@Fetch(FetchMode.SUBSELECT)
List<Transaction> transactions;

这将在您需要时再发出一次选择以获取所有未初始化的交易。这将要求您访问至少一个当前附加的用户事务,以触发对所有未初始化的当前附加事务的额外提取。

否则你可以使用批量获取:

@OneToMany
@BatchSize(size = 50)
List<Transaction> transactions;

同样,这需要一个打开的 session ,并在请求某个 User.transactions 时,所有与用户相关的交易将以 50 个为一组进行初始化。

但由于@BatchSize 仅针对集合设置,而不是@Entity 级别,这意味着在最好的情况下,您仍然需要对 N 个当前附加的用户进行 N 个额外查询。如果每个用户有超过 50 个交易,您将需要 N 个以上的查询。这可能比只需要一个查询 ( the original query is rerun using a sub-select to fetch all query related Users' transactions ) 的子选择提取更糟糕。

关于java - LazyCollectionOption.EXTRA 与 Spring 代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23786120/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com