|
|
|
Hibernate не пишет в базу
|
|||
|---|---|---|---|
|
#18+
Добрый день. Пытаюсь разобраться с Hibernate и никак не могу понять, почему не пишется в одну из таблиц. Создал класс Song: Код: 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. И класс Album Код: 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. И создал метод: Код: java 1. 2. 3. 4. Однако, запись хоть и добавляется в лист, но не пишется в таблицу. Что я делаю не так?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 15:56 |
|
||
|
Hibernate не пишет в базу
|
|||
|---|---|---|---|
|
#18+
Timein, хибер пишет в базу когда закрывается транзакция или сам сбрасываешь в базу. Найди рабочий пример hello world ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 16:12 |
|
||
|
Hibernate не пишет в базу
|
|||
|---|---|---|---|
|
#18+
Petro123, да искал, но, видимо, плохо( В основном просто описывается, как построить entity и repository, а дальше уже в main орудуют с созданным. А мне нужен отдельный класс( Потом, например, song.save(new Song()) в базу пишется) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 16:20 |
|
||
|
Hibernate не пишет в базу
|
|||
|---|---|---|---|
|
#18+
Timein, добрый день. Выложи код репозитария, укажи, как происходит управление транзакциями. Возможно, следует выложить весь проект - если управление транзакциями объявлено в конфигах. 1. Возможно, метод, возвращающий сущность, находится в autocommit mode, тогда сущность возвращается в "отсоединенном" (detached) состоянии и изменения, сделанные с ней впоследствии, не фиксируются. Именно поэтому в state-based (основанных на orm) репозиториях существует метод save - сущность извлекается из базы в контексте одной транзакции, далее эта транзакция завершается, и сущность необходимо добавить (merge) в контекст другой транзакции для сохранения. 2. Возможно, транзакция отмечена readonly (хотя не уверен, как в этом случае поведет себя сохранение). Исчерпывающее руководство ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 18:09 |
|
||
|
Hibernate не пишет в базу
|
|||
|---|---|---|---|
|
#18+
Timein, Да, еще проверь mappings между песнями и альбомами. Если они должны находится в отношении "многие-ко-многим", то аннотация должна быть @ManyToMany. Целесообразно проверить, какие запросы выполняет хибер. Настройки логирования . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 18:21 |
|
||
|
Hibernate не пишет в базу
|
|||
|---|---|---|---|
|
#18+
Андрей0407, Выглядит это сейчас так у меня: package com.example.configuration Код: 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. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. package com.example.domain; Код: 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. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. Код: 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. 50. 51. 52. 53. 54. 55. 56. package com.example.repository; Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Код: java 1. 2. 3. 4. 5. 6. 7. 8. package com.example; Код: 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. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Application Код: 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. Сейчас, если не убирать аннотацию Код: java 1. 2. то вылетает ошибка Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy37 cannot be cast to ru.sbrf.UserAlbumImpl Если убрать, то сохраняется только книга, без занесения во вторую таблицу library-books ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 18:31 |
|
||
|
Hibernate не пишет в базу
|
|||
|---|---|---|---|
|
#18+
Андрей0407, немного на другие сущности перешел. Я использую один ко многим, потому как у меня одна библиотека (один альбом, как в предыдущем случае) и в нем много книг) Исходил из того, что как-то странно хранить в книгах список библиотек, в которых они лежат... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 18:35 |
|
||
|
Hibernate не пишет в базу
|
|||
|---|---|---|---|
|
#18+
TimeinPetro123, да искал, но, видимо, плохо( В основном просто описывается, как построить entity и repository, а дальше уже в main орудуют с созданным. А мне нужен отдельный класс( Потом, например, song.save(new Song()) в базу пишется) не понял. Ещё раз. Если это ваш первый проект с хибером, то нужно найти любой работающий пример. Любой! А потом уже переделать его на свои хотелки . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 18:58 |
|
||
|
Hibernate не пишет в базу
|
|||
|---|---|---|---|
|
#18+
Petro123, большинство примеров используют xml, я же пытаюсь сделать через аннотации. Потом, там есть FactorySession, у меня по конфигу этого нет ( ну или оно создается как-то по-другому), а когда я пытаюсь прописать, прога ругается на два бина для создания. Примеры я поищу, но все же хочется и этот доделать... Хотя, возможно, предложенный вами путь и легче ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 19:31 |
|
||
|
Hibernate не пишет в базу
|
|||
|---|---|---|---|
|
#18+
Timein, 1. По поводу управления транзакциями. Действительно странно - сущность библиотеки загружается и модифицируется в одном контексте. Явно указано, что контекст не read only. При выходе из UserLibraryImpl.addBook должна происходить фиксация контекста и сохранение сущностей по каскаду. 2. По связыванию полей. Если вы моделируете отношение "один-ко-многим", то аннотация @JoinTable лишняя - мостовая таблица просто не нужна, в таблице книг будет fk на библиотеку. Но это не объясняет, почему связи не сохраняются. Вижу два пути. 1. Посмотреть, как поведет себя репозитарий при изменении одной сущности (чтобы исключить возможные проблемы в mappings). В рамках одного transactional метода: достаете из репозитария книгу, меняете ей название и выходите из метода, не сохраняя книгу. Если сохранение книги работает, то проблема в связывании. 2. Выкладываете проект полностью (с указанием информации для сборки: maven/gradle или что там). Попробую посмотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 19:37 |
|
||
|
Hibernate не пишет в базу
|
|||
|---|---|---|---|
|
#18+
Андрей0407, Да вот все, что есть, уже скинул. Собираю мавеном ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 19:40 |
|
||
|
Hibernate не пишет в базу
|
|||
|---|---|---|---|
|
#18+
Timein, желательно весь проект одним архивом. Лениво создавать проект, пакеты... Да и какие и Вас версии хибера и спрингов, я не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 19:47 |
|
||
|
Hibernate не пишет в базу
|
|||
|---|---|---|---|
|
#18+
Андрей0407, Хм... а как мне тогда вытягивать книги в библиотеку? Так он по ид подтягивает книги. Причем если в мостовой таблице есть значения, он их вытягивает. Но новые туда не пишет А если аннотации менять, то на что ее маппить? Создавать в буках поле library? @OneToMany(cascade = CascadeType.ALL, mappedBy = "?") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 19:48 |
|
||
|
Hibernate не пишет в базу
|
|||
|---|---|---|---|
|
#18+
Андрей0407, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 19:52 |
|
||
|
Hibernate не пишет в базу
|
|||
|---|---|---|---|
|
#18+
Timein, По поводу отношения между сущностями - решать Вам. Отношение "один ко многим" - в одной библиотеке много книг, каждая книга принадлежит одной библиотеке. В простом случае для родительской сущности (библиотека) достаточно указать @OneToMany над коллекцией. В дочерней сущности будет определен внешний ключ, указывающий на библиотеку, которой принадлежит книга, см. здесь . Отношение "многие ко многим" - в одной библиотеке много книг, каждая книга может принадлежать более чем одной библиотеке. В простом случае для родительской сущности достаточно указать @ManyToMany над коллекцией, переопределить @JoinTable. В этом случае ключа недостаточно, нужна мостовая таблица. Отношения бывают однонаправленные (библиотека знает, какие в ней книги, но книга не знает о библиотеке, поэтому в сущности "Книга" не надо определять поле "Библиотека") и двунаправленные (bidirectional). Для моделирования двунаправленных отношений используется свойство аннотации mappedBy, указывающее, кто владеет отношением. От этого зависит (если правильно помню), как будет осуществляться задание связывающего поля - сразу, при insert, или отдельным update-ом. В вашем случае, наверное достаточно однонаправленного отношения один ко многим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 20:17 |
|
||
|
Hibernate не пишет в базу
|
|||
|---|---|---|---|
|
#18+
Андрей0407, поставил просто @OneToMany Создалась таблица Library_books c 3 колонками - id library, id book, id booklist и по прежнему пустая( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 20:49 |
|
||
|
Hibernate не пишет в базу
|
|||
|---|---|---|---|
|
#18+
Timein, Извините, ввел Вас в заблуждение - поддержка связи "один ко многим" через мостовую таблицу возможна. Так предполагается делать, если внешний ключ может быть nullable - наличие null снижает "качество данных". Что же касается Вашего примера, он вполне рабочий - связи между сущностями создаются и сохраняются. Из лога: Лог для неизмененного приложения Код: plaintext 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. Проверил напрямую - запросом к базе *после* завершения приложения. Возможно, проблема обусловлена тем, что используется обычная база, а не in-memory , и в ней остались артефакты. Настроил для примера логирование и поменял связи на многие ко многим (см. Application.main). Измененный пример во вложении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 22:08 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39369636&tid=2123368]: |
0ms |
get settings: |
11ms |
get forum list: |
24ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
73ms |
get tp. blocked users: |
2ms |
| others: | 245ms |
| total: | 416ms |

| 0 / 0 |
