| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > hibernate и сохранение в таблицу связи one-to-many |
| Автор: umen 25.4.2007, 14:03 | ||||||||||
| Добрый день. Есть два класса User, Story
Есть маппинги к ним
есть тестовый класс
в таком виде всё работает. Если в самом конце теста убрать комменты то вываливается ексепшн: java.lang.NullPointerException а по идее должна добавлятся запись в таблицу story Не могу понять в чём проблема, помогите пожалуйста |
| Автор: umen 25.4.2007, 18:45 |
| Для того чтобы легче было понять в чём проблема, я написал два минимальных класса (с минимумом кода) User и Story И организовал между ними двухстороннюю связь one-to-many. Результат работы - такой же как и в первом случае :-( минимальный код - во вложении (только *.java, *.hbm.xml) Может всё-таки кто=-то сможет понять в чем проблема |
| Автор: practices 1.5.2007, 22:40 | ||||
| Если подумать логически, когда загружаем объекты определённого класса (в даном примере User), вместе с каждым объектом загружается набор связанных объектом другого класса (Set stories). Таким образом, объект user содержит ссылки на существующие в БД stories. Когда мы добавляем новую story user-у, то нужно сначала сохранить её в БД (save(story)),и только потом можно сохранять user с этой story. То есть:
Или перемести строчку save(storyX) перед stories.add.
|
| Автор: umen 2.5.2007, 00:19 |
| При всём уважении, позволю себе не согласиться: магия технологии Hibernate в том и состоит, что не нужно заботится о сохранении всех объектов, в данном случае после добавления истории пользователю и сохранении пользователя, Hibernate сам определяет связи объектов и правильно сохраняет в базу пользователя и добавленную ему историю. В подтверждение своих слов привожу вложение, где всё работает. Кстати я так до сих пор и непонял, почему это не работает в коде приведённом выше :( |
| Автор: seth 27.1.2008, 23:28 | ||
| мож кому то пригодится - нашел решение этой проблемы: http://www.laliluna.de/254.html т.е. нужно добавить
удачи всем |
| Автор: Ornitos 31.1.2008, 13:43 |
| Каскадное поведение в хибернейт имеет некоторые странности. Например, даже если вы везде выставили cascade="all", при удалении объектов при помощи HQL запроса зависимые объекты каскадно удаляться не будут. |
| Автор: greef 31.1.2008, 14:40 |
| Может кто-то объяснит в 2 словах: что значит и в каких случаях использовать 1) cascade="all" 2) inverse="true" А то прочтение документации полного ответа не дало. |
| Автор: Ornitos 2.2.2008, 14:39 |
Включает для данной ассоциации все виды каскадного поведения: каскадную вставку, обновление, удаление и репликацию. Например, при вставке сущности в базу, будет автоматически вызвана вставка и тех сущностей, для ассоциаций с которыми включена каскадная вставка. Аналогично обновление, удаление и репликация. http://simoes.org/docs/hibernate-2.1/155.html |
| Автор: umen 5.3.2009, 11:34 | ||||
Чтобы каскад работал и при удалении, нужно использовать cascade="all-delete-orphan" :
|