我目前在内存中使用Grails 2.3.3运行' H2数据库。
H2在哪里保留所有子项的ID并且#34; hasMany" /" areTo"条件。
我认为在子域之上必须有一个额外的存储位置,用于存储子域模型中的父ID。
我假设这是因为我需要在直接从其域模型中删除子项之前运行removeFrom命令。
例如:
父域模型具有hasMany构造:
static hasMany = [ videoCatDataHM: VideoCatDataShr]
子域名拥有免费的“属于”权利。构建体:
static belongsTo = [ vidCatAdminBT: VideoCatAdminShr]
子域模型中有一个名为VID_CAT_ADMIN_BT_ID的列正确存储了父级的ID。
在子实例上运行删除之前,我必须运行此removeFrom命令:
vidCatAdminId.removeFromVideoCatDataHM(videoCatDataShrInstance)
这表明父母拥有与子DM相关联的所有hasMany子女的额外记录。
正如所建议的,我已将Hibernate日志记录添加到此应用程序 - 这里是非选择(即DM更改)日志:
Hibernate:更新video_cat_admin_shr set version = ?, description = ?, name = ?, organbt_id =?其中id =?和版本=?
Hibernate:从video_cat_data_shr中删除id =?和版本=?
更新正在更新父实例(可能是通过removeFrom调用),删除正在删除子实例。在删除之前和之后通过dbconsole查看父实例表明对父实例的唯一更改是实例的版本号加1。
答案 0 :(得分:2)
请注意,这与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日志记录以查看使用的实际查询。