我目前正在使用“内存中” 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/