|
|
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Помогите пожалуйста. Есть три сущности: Users, Books, Comments Users @OneToMany Comments Books @OneToMany Comments Comments @ManyToOne Users, Books Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. В консоль выводит: Код: plsql 1. 2. 3. 4. 5. По идее как я понимаю null не должно выводить. Подскажи, может аннотации @OneToMany и @ManyToOne не правильно написал? Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2012, 01:15:17 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
Это все должно выглядеть примерно вот так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2012, 11:34:19 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
Спасибо, поменял, все-равно не работает, также выводит ссылки null. Может в чем-то другом проблема? Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2012, 13:46:13 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
Попробуйте cascade = {CascadeType.REFRESH} поменять на cascade = {CascadeType.ALL} НО!!! Возьмите себе за правило, что когда имеете дело с двунаправленными отношениями, то явно обновляйте их с обоих сторон. Т.е. вместо Код: java 1. надо писать Код: java 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2012, 15:09:53 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
авторПопробуйте cascade = {CascadeType.REFRESH} поменять на cascade = {CascadeType.ALL} Поменял. Также выдает null Код: java 1. 2. После этого конечно поля заполнены, но это ручная работа.Не понимаю тогда смысла данных аннотаций. Я думал что поля должны заполнятся автоматически. Хотя конечно тут ключевое слово "думал" :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2012, 15:48:33 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
Скорее всего, это связано с тем, что вы каждое действие делаете в отдельной транзакции. Попробуйте сделать все в одной транзакции, а для записи изменений в базу используйте session.flush(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2012, 18:57:32 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
Это то есть примерно так? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. Все-равно выводит нулл) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 00:32:03 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
Хотя конечно если явно обновлять, то все ок ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 00:32:50 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
krab, Убери все лишние поля из примера и обьясни БЛ по связям. Для какой задачи они нужны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 07:27:55 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
krab, Попробуйте оставить один flush в самом конце. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 08:51:23 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
Petro123, Есть 3 таблицы. Users, Books, Comments Users имеет много комментариев, то есть связь один ко многим: Код: java 1. 2. Books имеет много комментариев, то есть связь один ко многим: Код: java 1. 2. Comments соответственно: Код: java 1. 2. 3. 4. 5. 6. 7. Хочу чтоб при заполнении полей авторprivate Books book; и авторprivate Users user; автоматически добавлялись комментарии в списки авторprivate List<Comments> commentsForUser; и авторprivate List<Comments> commentsForBook; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 11:28:36 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
Leonidv, Не помогло) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 11:30:39 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
krabComments соответственно: доп.вопрос - зачем в комментарии тебе доп.ссылки на родителей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 11:36:49 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
krab, вопрос снимается. Позже в коде посмотрю - отвечу. Общий случай тебе svenom сказал - вручную и небольшая автоматизация при inverse = True 2 метода объединить в один. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 11:43:03 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
krab, ну, давай попробуем.... По логике не вяжется. - Зачем нужны о одних комментариев - 2 родителя? - Что за комментарии у Books? IMHO неправильные ассоциации в модели предметной области. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 11:54:50 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
В объектной модели все в порядке. Каждый комментарий связан с прокомментированной книгой и с пользователем, который его оставил. Логично, что в какой-то момент мы можем захотеть посмотреть все комментарии к данной книге или все комментарии данного пользователя. Логично и разумно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 11:59:11 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
svenomВ объектной модели все в порядке. Каждый комментарий связан с прокомментированной книгой и с пользователем, который его оставил. Логично, что в какой-то момент мы можем захотеть посмотреть все комментарии к данной книге или все комментарии данного пользователя. Логично и разумно. я не спорю, я предлагаю ВРЕМЕННО убрать ЧТО МЫ ХОТИМ СМОТРЕТЬ и отработать персистентность. Т.е. легко и просто сохранять в БД Или ИДТИ ОТ БД а не от ОРМ. От ОРМ можно пойти через 15 минут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 12:05:17 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
krab, предметная область. От неё зависит модель. - что является ПРЕДМЕТОМ учёта? Вариант: Книги много комментариев + пользователь или Код: java 1. 2. ______________________________________________ "Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн. AutoPOI.ru — ГИС-технологии для Oracle ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 12:13:23 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
Petro123, Я ценю Вашу помощь, но немного не понимаю Вас. Предметная область вроде и так должна быть ясна. Обычная библиотека с книгами. Каждая книга может иметь множество комментариев. Также и пользователь может иметь множество комментариев. Книги один ко многим -> Комментарии Пользователь один ко многим -> Комментарии ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 15:22:46 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
krabPetro123, Предметная область вроде и так должна быть ясна. Обычная библиотека с книгами. ===== нет, если главный - Комментатор или Писатель, то модель будет другая. Предположим что - Библиотека - OK Каждая книга может иметь множество комментариев. Также и пользователь может иметь множество комментариев. нет. Пользователь имеет множество только опосредствованно, по ссылке через другой объект. Т.е. сам по себе, без книг, он имеет комментарии только по ДОП.запросу _аналитическому_ в БД. Т.е. он имеет множество комментарие, но только через книги которые комментирует. Ведь комментарий без книги невозможен? (NOT NULL) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 15:29:07 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
пы сы - отформатировал krabPetro123, Предметная область вроде и так должна быть ясна. Обычная библиотека с книгами. ===== нет, если главный - Комментатор или Писатель, то модель будет другая. Предположим что - Библиотека - OK Каждая книга может иметь множество комментариев. Также и пользователь может иметь множество комментариев. нет. Пользователь имеет множество только опосредствованно, по ссылке через другой объект. Т.е. сам по себе, без книг, он имеет комментарии только по ДОП.запросу _аналитическому_ в БД. Т.е. он имеет множество комментарие, но только через книги которые комментирует. Ведь комментарий без книги невозможен? (NOT NULL) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 15:30:54 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
krab, не забывайте про БД и 3 степени нормализации. Покажите 3 таблички с 2-мя заполненными строками. Как бы вы хотели видеть в БД. У нас ООБД пока не существует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 15:33:20 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
Petro123, авторВедь комментарий без книги невозможен? Да, также и книгу нельзя посмотреть без входа в библиотеку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 15:37:54 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
krabPetro123, авторВедь комментарий без книги невозможен? Да, также и книгу нельзя посмотреть без входа в библиотеку. класса библиотеки у нас нету :) Держи вариант: ВИ - User - справочник а не встроенный класс в Коммент Применяют когда выделенный класс User достаточно большой и его выбирают на клиенте из комбобокса. ==================== Книги ----много ко много -------Пользователь 1 Книга - много комментариев (1 к *) Комментарий - справочникПользователь (FK) авторКнига код Название1 ВойнаИмир2 Мурзилка авторКоммент код кодКниги FKUser Текст23 2 34 Плохая45 2 34 Супер авторUser код FIO34 Петров34 Сидоров вот эту схему БД пробуй промаппить на ОРМ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 15:49:37 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
да, каскад на удаление только с книги на коммент. База юзверей не удаляется. Получится маппинг с минимумом полей в классах напиши. Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 15:56:49 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
Petro123, Спасибо за помощь :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 16:02:18 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
svenom , почему нужно обновление с обоих сторон? У меня нормально работает с одной стороны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 16:27:16 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
jab svenom , почему нужно обновление с обоих сторон? У меня нормально работает с одной стороны.Это просто правило хорошего тона, что бы когда: а) ваш код будет смотреть другой человек б) ваш код будете смотреть вы же через N месяцев или после перепоя или невыспавшиймся ... сразу было ясно, что происходит. Если же вы не делаете обновление с другой стороны, то оно становится неявным, что значительно ухудшает читаемость кода и его интуитивное восприятие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 16:33:05 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
авторsvenom, почему нужно обновление с обоих сторон? У меня нормально работает с одной стороны. Не то чтобы оно уж так необходимо, просто это хорошая пратика, если у вас в течение реквеста идет работа только с одной сущностью, то все будет ок. Но представь такую ситуацию, ты работаешь с главной энтити, в которую добавляешь элемент коллекции, затем тебе надо перебрать коллекцию и сделать что-то с каждым элементом коллекции, и вот при этом что-то нужно иметь ссылку на парента, если не обновлять связи с двух сторон - то будет нулл поинтер, к тому же могут быть проблемы когда одна бизнес-транзакция распределена на несколько реквестов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 16:37:09 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
авторваш код будете смотреть вы же через N месяцев или после перепоя или невыспавшиймся ... сразу было ясно, что происходит. Если же вы не делаете обновление с другой стороны, то оно становится неявным, что значительно ухудшает читаемость кода и его интуитивное восприятие. Хороший поинт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 16:38:00 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
тут надо чётко знать что именно делает хибер. Парент иногда нужен, если знать что именно он делает, и если он не делает в БД дополнительных полей (двойное сохранение). Например, один чел в сети жалуется, что у него каскад не работает пока не добавил парента в child. Спрашивается, какого лешего? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 16:45:42 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
в субд не принято, делать запросы - загодя. А вот в десктопе, в дереве элементов - принято (у каждого нода - парент на всякий случай) Это из той же серии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 16:49:24 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
А я всегда думал, что добавляя чилд через парэнта и парэнта через чилд я получу в результате два парэнта и два чилда. Не проверял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 17:33:16 |
|
||
|
Hibernate @OneToMany @ManyToOne
|
|||
|---|---|---|---|
|
#18+
авторА я всегда думал, что добавляя чилд через парэнта и парэнта через чилд я получу в результате два парэнта и два чилда. Не проверял. Скорее всего при добавлении чайлда к паренту все будет ок, а вот когда делаешь child.setParent(parent), а потом parent.getChilds() - добавленный элемент может и не находится в коллекции. Давно не работал с хибернейт, но в какой-то версии точно были косяки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2012, 17:41:29 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2132635]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
| others: | 311ms |
| total: | 450ms |

| 0 / 0 |
