Hibernate hasMany / belongsTo结构

时间:2015-11-10 19:14:02

标签: grails gorm

我目前在内存中使用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。

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日志记录以查看使用的实际查询。