Сопоставление объекта в гибернации, имеющего 2 списка, вызывающих проблемы

#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’ Это должно сработать, как я думаю, но опять же не уверен, как это делается в сопоставлениях в режиме гибернации.