#java #hibernate #hbm
#java #режим гибернации #hbm
Вопрос:
Я пытаюсь сохранить объект, который имеет 2 похожих списка, используя hbm.xml файл. Ниже приведен мой объект модели и HBM:
public class MyClass {
...
private List<MyType> list;
private List<MyType> otherList;
...
}
Мой HMB для этого раздела следующий:
<list name="list" cascade="all-delete-orphan"
lazy="false">
<key column="USER_ID" />
<list-index column="index" />
<one-to-many class="path.to.MyType" />
</list>
<list name="otherList" cascade="all-delete-orphan"
lazy="false">
<key column="USER_ID" />
<list-index column="index" />
<one-to-many class="path.to.MyType" />
</list>
Однако, когда этот объект заполняется из базы данных, все, что я ожидаю увидеть в ‘list’, также отображается в ‘otherList’. Я полагаю, мне не хватает простого изменения конфигурации, позволяющего hibernate правильно хранить эти 2 списка, но я не могу понять это.
Любая помощь?
Комментарии:
1. Как вы ожидаете, что он будет представлен в базе данных?
2. Привет, смотрите мой комментарий к ответу ниже для получения дополнительных разъяснений.
Ответ №1:
<list>
Они содержат одинаковое содержимое, потому что вы указываете Hibernate сопоставить один и тот же класс ( path.to.MyType
), используя один и тот же <key column="USER_ID">
в обоих экземплярах. Вы уверены, что не допустили ошибки в отображении в режиме гибернации?
Концептуально, что Hibernate сделает для материализации этих коллекций, так это выдаст запрос типа
SELECT m.* from MyType m where m.USER_ID = this.USER_ID
Если вы укажете Hibernate использовать один и тот же запрос для сопоставления обоих list
и otherList
, как он может возвращать разные результаты для одного и того же запроса?
Комментарии:
1. Я точно понимаю, что вы имеете в виду, но я не уверен относительно правильного способа это сделать. В принципе, я хочу сохранить 2 отдельных списка MyType для каждого пользователя, следовательно, USER_ID является ключевым. Очевидно, что это отлично работает, если есть 1 список, но я не уверен, какие изменения мне нужно внести, чтобы разрешить сохранение 2 списков одного типа.
2. Что ж, может быть полезно проигнорировать режим гибернации и подумать о том, как вы бы это моделировали, как в структуре таблицы, так и с SQL-запросами — какой столбец будет служить ссылкой на таблицу MyType для list1 и какой столбец будет служить ссылкой для list2? Вы также можете перечитать главу в справочном руководстве Hibernate по ассоциациям , которая включает в себя множество примеров различных способов моделирования различных типов ассоциаций между классами.
3. MyType имеет логический столбец, который определяет, в каком списке должна быть строка (вместе с USER_ID). В основном то, что я ищу, — это инструкции select, чтобы иметь возможность сказать ‘ВЫБЕРИТЕ m.* из MyType m, где m.USER_ID = this. USER_ID и m.MY_BOOLEAN = true / false’ Это должно сработать, как я думаю, но опять же не уверен, как это делается в сопоставлениях в режиме гибернации.