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, чтобы увидеть фактические используемые запросы.

Другие вопросы по тегам