- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想显示一个表,其中包含我数据库的所有用户。该表还应包含用户对象中包含的列表的元素数。因为我只需要大小/数量,所以我想阻止获取整个列表。因此,我正在使用 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/
我想显示一个表,其中包含我数据库的所有用户。该表还应包含用户对象中包含的列表的元素数。因为我只需要大小/数量,所以我想阻止获取整个列表。因此,我正在使用 LazyCollectionOption.EX
我有一个实体,其中一个字段用 @LazyCollection(LazyCollectionOption.FALSE) 注释。我不能(不允许)改变这一点。是否可以通过 @FetchProfile 覆盖它
我对“延迟加载”有一个疑问。使用 @LazyCollection(LazyCollectionOption.FALSE) 和 @OneToMany(fetch = FetchType.EAGER) 有
我是一名优秀的程序员,十分优秀!