grails - `getPersistentValue` 应该用于集合吗?

标签 grails grails-orm

如果 Team hasMany = [players: Player]Player belongsTo = [team: Team], team.getPersistentValue('players') 是否应该从数据库中返回 players 列表(如 in the guide 所述)?还是这仅适用于非集合属性?

对我来说,它返回与 team.players 相同的列表,即使我使用 addToPlayersremoveFromPlayers 更新了列表(Grails 2.3.4 ).

最佳答案

getPersistentValue 不去数据库。当 Hibernate 创建域类实例时,它保留原始数据的副本,这就是用于 isDirty 检查和 getPersistentValue 的副本。 Hibernate 在刷新时使用数据对当前状态与原始状态进行逐字段比较,以确定是否应将任何内容推送到数据库。

但是集合是不同的。它不是一个简单的 HashSet/ArrayList - 它是一个可感知变化的 PersistentSet/PersistentList。但它不跟踪发生了什么变化,只是发生了一些变化。因此,如果不去数据库,就没有什么可以通过比较来找到以前的状态。

最大的问题是对于小型集合,您可以为此实现一些合理的措施。但在一般情况下,您不知道集合可能有多大,并且可能包含大量元素,因此在内存中执行此操作会非常昂贵。

关于grails - `getPersistentValue` 应该用于集合吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20440218/

相关文章:

grails - 使用图像名称上传Grails文件

data-binding - Grails - 从数据绑定(bind)的hasMany关联列表中删除项目?

node.js - Grails 作为单个应用程序或不同的后端和前端应用程序

mysql - GORM tablePerHierarchy false,外键

mysql - 如何在 list.gsp 中显示链接表值而不是 id? chalice

mysql - Grails 子查询

java - 与 Grails 类似的 Web 框架,但使用 Java 而不是 Groovy?

grails - 为什么在域中更改映射属性不会生成新的变更日志行?

mysql - Grails:运行时改变dataSource url实现 Multi-Tenancy 数据库分离

java - 如何在列出 Grails 域时排除某些字段?