#hibernate #one-to-many #hibernate-mapping #hibernate-onetomany
#спящий режим #один ко многим #спящий режим-отображение #спящий режим -onetomany
Вопрос:
Я борюсь со следующей проблемой, и я хочу, как реализовать чистое решение.
Представьте себе эту Сущность-Диаграмму:
В книге есть страницы, и к каждой книге пользователь может добавлять заметки. Для каждой Заметки пользователь может указать множество Страниц, на которые ссылается Заметка.
Когда я создаю новую структуру этого и пытаюсь сохранить ее, я получаю следующее исключение:
TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved before current operation : NoteToBokPage.page -> page",
Итак, спящий режим говорит мне сначала сохранить страницу, прежде чем я смогу сохранить NoteToBookPage. Это означало бы, что я не могу каскадировать сохранение для всех элементов.
Было бы лучшим способом затем настроить все объекты на КАСКАДИРОВАНИЕ.ВСЕ вместо NoteToBookPage, а затем вручную сохранить для NoteToBookPage? Это хороший подход?
Моя проблема в том, что моя структура фактически больше. Книга не является корнем. Выше есть два уровня, и мой план состоял в том, чтобы предложить только один метод обновления для всего дерева, запустив обновление корневого элемента с каскадированием всего. Это кажется уродливым, когда вы сохраняете все с помощью каскада вместо одного листа и делаете это вручную впоследствии. Есть ли возможность сообщить Hibernate, что он должен сначала сохранить страницу, прежде чем сохранять NoteToBookPage? Я надеялся, что это сработает, когда я помещу PageList-Attriubte в класс Book над атрибутом NoteList, но этого не произошло.
Есть идеи, как справиться с этим сексуальным способом?
Спасибо
Комментарии:
1. Я не уверен, что смогу следовать, но добавление вашего фактического кода (или упрощенного примера для воспроизведения проблемы) помогает. Теоретически JPA довольно прост: либо вы работаете с одним объектом, поэтому все объекты, с которыми вы работаете в другом месте, должны управляться, либо вы используете каскады, если хотите сохранить весь график сразу.
Ответ №1:
Наконец-то я нашел проблему.
Проблема возникла, когда я создал фиктивную структуру сущности и попытался ее сохранить. Я допустил ошибку, что объект, на который ссылается другой объект, не был тем же экземпляром Java. Я создал новый экземпляр с теми же значениями, но поскольку я использую стандартный java-объект equals / hascode, hibernate не распознает его как equals.
Когда я создаю свою фиктивную структуру, я должен убедиться, что все объекты, на которые ссылаются, на самом деле являются одним и тем же экземпляром объекта java. Тогда hibernate может сохранять всю структуру сразу.