Hibernate Envers: я получаю нулевые значения в списке при загрузке ревизии - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть объект "Foo", который содержит список других объектов "Bar".Если я загружаю ревизию Foo, я получаю свой правильно упорядоченный список баров - однако я также получаю ряд нулей.Если я посмотрю на таблицу аудита, которая содержит столбцы, то при первоначальном сохранении объекта я увижу что-то вроде этого:

    id   | rev  | revtype |    create_timestamp     |    update_timestamp     | updated_by_id | created_by_id | foo_id                | bar_index     | bar_value
   ------+------+---------+-------------------------+-------------------------+---------------+---------------+-----------------------+---------------+-----------
    1000 | 1000 |       0 | 2018-09-28 12:26:48.49  | 2018-09-28 12:26:48.49  |             1 |             1 |                       |               | ValueA    
    1001 | 1000 |       0 | 2018-09-28 12:26:48.49  | 2018-09-28 12:26:48.49  |             1 |             1 |                       |               | ValueB    
    1000 | 1000 |       0 |                         |                         |               |               |                  1000 |             0 |           
    1001 | 1000 |       0 |                         |                         |               |               |                  1000 |             1 |           

Итак, в будущем я хочу взять Foo, у которого есть Revision 1000 для баров, которые я заканчиваюс 2 нулями и двумя моими значениями.Видя этот стол, я не совсем удивлен.Если кажется, что ошибка в том, как обрабатываются списки, если я изменяю его на набор, он работает нормально (поэтому я думаю, что я мог бы оставить его как набор, а затем заполнить индексный столбец сам и отсортировать его сам при загрузке - но это не так)отлично подходит для иерархии объектов и большого количества списков) Но я мог просто что-то упустить из-за того, как я делаю вещи.

Отображение в Bar:

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "foo_id")
    @OrderColumn(name = "bar_index")
    private List<Bar> bars = new ArrayList<>();

Есть какие-нибудь мысли о том, как сделать так, чтобы в загруженном списке не было нулей?Это ошибка Envers, ошибка Hibernate, ошибка пользователя?Спасибо!

1 Ответ

0 голосов
/ 05 октября 2018

Вот то, что, как мне кажется, происходит (и как это исправить). Выше приведено однонаправленное отношение OneToMany, в котором не используется таблица соединений.Таким образом, у вас есть только FOO и BAR столы.

В моем случае я назвал их FOO и FOO_BAR (со связанными таблицами _AUD)

Однако Энверс требует в этой ситуации дополнительную таблицу соединений аудита (по разным уважительным причинам) и следит за тем, чтобыявляется таблицей соединений с именем ONE_MANY_AUD, поэтому в данном случае кажется, что она ожидает FOO, FOO_AUD, BAR, BAR_AUD, FOO_BAR_AUD и обеспечивает принудительное выполнение таблицы присоединения к аудиту.

У меня был только FOO, FOO_AUD, FOO_BAR и FOO_BAR_AUD, с которыми Энверс был в порядке, потому что он, кажется, соответствует ожидаемому именованию таблицы соединения, но вызывает проблему, описанную в вопросе.

Я не совсем уверен, что Энверс делает в этой ситуации, похоже, что он пытается поместить аудиты для Бар и отношения Foo-Bar в одну таблицу.

Слишкомисправить, я мог бы сделать мою таблицу Bar фактически называемой BAR (с BAR_AUD) и добавить ожидаемую таблицу соединений аудита FOO_BAR_AUD.В этот момент все работает так, как ожидалось, и я не получаю нулевые значения в списке BAR при получении ревизий FOO.

Было бы неплохо обновить проверки в Envers, чтобы уловить эту ситуацию, если это так.возможно (и я успешно угадываю, что происходит!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...