如果Team
hasMany = [players: Player]
和Player
belongsTo = [team: Team]
,team.getPersistentValue('players')
应该从数据库中返回players
列表(如上所述{{3} }})?或者这仅适用于非收集属性?
对我而言,它返回与team.players
相同的列表,即使我使用addToPlayers
和removeFromPlayers
(Grails 2.3.4)更新了列表。
答案 0 :(得分:6)
getPersistentValue
不会进入数据库。当Hibernate创建域类实例时,它会保留原始数据的副本,这是用于isDirty
检查和getPersistentValue
的内容。 Hibernate在刷新时使用数据来对当前状态与原始状态进行逐场比较,以确定是否应将任何内容推送到数据库。
然而,集合是不同的。这不是一个简单的HashSet
/ ArrayList
- 它是一个具有变化意识的PersistentSet
/ PersistentList
。但它没有跟踪发生了什么变化,只是发生了变化。所以没有什么比较可以在不进入数据库的情况下找到以前的状态。
最大的问题是,对于小型馆藏,你可以实现一些明智的东西。但是在一般情况下你不知道集合有多大,它可能有很多元素,所以在内存中这样做会非常昂贵。