grails - Hibernate的hasMany/belongsTo结构

标签 grails gorm

我目前正在使用“内存中” H2数据库运行Grails 2.3.3。

H2将“hasMany” /“belongTo”条件的所有子代实例的ID保留在哪里。

我认为在子域模型中存储父ID的列上方必须有一个额外的存储位置。

我以为是因为我需要先从其域模型直接删除子级之前运行removeFrom命令。

例如:

父域模型具有hasMany构造:

static hasMany = [ videoCatDataHM: VideoCatDataShr]

子域具有免费的“belongsTo”构造:
static belongsTo = [ vidCatAdminBT: VideoCatAdminShr]

子域模型中有一列名为VID_CAT_ADMIN_BT_ID的列,该列正确存储了父域的ID。

在子实例上运行删除之前,我必须运行以下removeFrom命令:
vidCatAdminId.removeFromVideoCatDataHM(videoCatDataShrInstance)

这表明,父级与子DM中保存的ID分开保存与它关联的所有hasMany子级的其他记录。

如建议的那样,我已经向该应用程序添加了Hibernate日志记录-这是非选择(即DM更改)日志:

Hibernate: update video_cat_admin_shr set version=?, description=?, name=?, organbt_id=? where id=? and version=?

Hibernate: delete from video_cat_data_shr where id=? and version=?



更新正在更新父实例(大概是通过removeFrom调用),而删除操作正在删除子实例。在删除之前和之后通过dbconsole查看父实例表明,对父实例的唯一更改是实例的版本号增加了一个。

最佳答案

注意,这与H2无关,在Hibernate GORM实现管理的任何关系数据库中都是一样的。

在这种情况下,您已经定义了双向一对多,因此您已经回答了问题-它是子表中与“owner”属性相对应的列,在本例中是VID_CAT_ADMIN_BT_ID中的VideoCatDataShr.vidCatAdminBT

但是数据库中没有存储任何子ID的集合,而是根据需要查询这些ID,本质上是

select VID_CAT_ADMIN_BT_ID from video_cat_data_shr where id=?

在哪里?是拥有的VideoCatAdminShr实例的ID。该查询将找到使用此外键链接回父级的所有子级记录。打开SQL日志记录以查看所使用的实际查询。

关于grails - Hibernate的hasMany/belongsTo结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33637762/

相关文章:

email - Grails:当 SMTP 服务器暂时关闭时如何缓冲出站电子邮件?

testing - 使用 Maven 进行 Grails 集成测试

grails - 移动到另一台电脑后无法在 STS 中运行 grails 应用程序

grails - Grails-将hasMany关系从一个域对象复制到另一个域对象?

grails - GORM mongodb 映射到现有集合结构

java - Grails标记actionSubmit导致404错误

grails - 是否可以在Grails中使用只读的JNDI数据源?

grails - 成功调用服务后,Grails无法提交

grails - “GORM support for Hadoop HBase plugin”不支持grails 2.1.0

grails - 通过Grails测试通过Controller中的Domain类访问db中的数据