Hibernate имеет много / принадлежит к структуре
В настоящее время я использую Grails 2.3.3 с базой данных H2 "в памяти".
Где H2 хранит идентификаторы всех дочерних экземпляров условия "hasMany"/"ownTo".
Я считаю, что должно быть дополнительное место хранения над столбцом, в котором хранится родительский идентификатор в модели дочернего домена.
Я предполагаю это, потому что мне нужно выполнить команду removeFrom перед удалением дочернего элемента непосредственно из его доменной модели.
Например:
Модель родительского домена имеет конструкцию hasMany:
static hasMany = [ videoCatDataHM: VideoCatDataShr]
дочерний домен имеет бесплатную конструкцию ownTo:
static belongsTo = [ vidCatAdminBT: VideoCatAdminShr]
В модели дочернего домена есть столбец VID_CAT_ADMIN_BT_ID, в котором правильно хранятся идентификаторы родительского домена.
Перед запуском удаления на дочернем экземпляре я должен выполнить команду removeFrom:
vidCatAdminId.removeFromVideoCatDataHM(videoCatDataShrInstance)
Это говорит о том, что родитель хранит дополнительные записи всех связанных с ним потомков hasMany отдельно от идентификаторов, хранящихся в дочернем DM.
Как и предполагалось, я добавил протоколирование Hibernate в это приложение - вот журналы невыборки (то есть изменения DM):
Hibernate: обновить video_cat_admin_shr установить версию =?, описание =?, имя =?, organbt_id=? где id =? а версия =?
Hibernate: удалить из video_cat_data_shr, где id =? а версия =?
Обновление обновляет родительский экземпляр (предположительно, через вызов removeFrom), а удаление удаляет дочерний экземпляр. Просмотр родительского экземпляра через dbconsole до и после удаления показывает, что единственным изменением родительского экземпляра является то, что номер версии экземпляра увеличивается на единицу.
1 ответ
Обратите внимание, что это не имеет ничего общего с H2, это будет то же самое в любой реляционной базе данных, управляемой реализацией Hibernate GORM.
В этом случае вы определили двунаправленный один-ко-многим, поэтому вы ответили на свой вопрос - это столбец в дочерней таблице, соответствующий свойству "owner", в данном случае VID_CAT_ADMIN_BT_ID
от VideoCatDataShr.vidCatAdminBT
,
Но в базе данных не хранится ни одна коллекция дочерних идентификаторов, скорее, идентификаторы запрашиваются по мере необходимости, по существу
select VID_CAT_ADMIN_BT_ID from video_cat_data_shr where id=?
где? это идентификатор владельца VideoCatAdminShr
пример. Этот запрос найдет все дочерние записи, связанные с родителем с помощью этого внешнего ключа. Включите ведение журнала SQL, чтобы увидеть фактические используемые запросы.