如果 Team
hasMany = [players: Player]
和 Player
belongsTo = [team: Team]
, team.getPersistentValue('players')
是否应该从数据库中返回 players
列表(如 in the guide 所述)?还是这仅适用于非集合属性?
对我来说,它返回与 team.players
相同的列表,即使我使用 addToPlayers
和 removeFromPlayers
更新了列表(Grails 2.3.4 ).
最佳答案
getPersistentValue
不去数据库。当 Hibernate 创建域类实例时,它保留原始数据的副本,这就是用于 isDirty
检查和 getPersistentValue
的副本。 Hibernate 在刷新时使用数据对当前状态与原始状态进行逐字段比较,以确定是否应将任何内容推送到数据库。
但是集合是不同的。它不是一个简单的 HashSet
/ArrayList
- 它是一个可感知变化的 PersistentSet
/PersistentList
。但它不跟踪发生了什么变化,只是发生了一些变化。因此,如果不去数据库,就没有什么可以通过比较来找到以前的状态。
最大的问题是对于小型集合,您可以为此实现一些合理的措施。但在一般情况下,您不知道集合可能有多大,并且可能包含大量元素,因此在内存中执行此操作会非常昂贵。
关于grails - `getPersistentValue` 应该用于集合吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20440218/