|
|
|
[Hibernate] Many to Many - Delete record from Join Table by Id
|
|||
|---|---|---|---|
|
#18+
Пытаюсь влюбиться в Хибер, но пока этот процесс идет туговато. Помогите, люди добрые. Есть довольно тривиальная ситуация с Many to Many - 3 entity: Users, Tickets, Comments (id, id_user, id_ticket, comment, comment_date). Я воспользовался одним из туториалов, где предлагается создать класс для композитного ключа. User.java Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Ticket.java Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Comment.java Код: 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. CommentID.java Код: 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. В качестве repository использую голый CrudRepository. Все вроде бы хорошо, пока мне не пришла в голову идея удалить комментарий по ID. Если удаляю через Long: Код: java 1. то получаю Код: java 1. Вроде бы логично, но у CrudRepository не метода удаления с таким параметром. Стоит ли его создать самому, или же это идеологически неверно? Если улаляю через Comment Код: java 1. то Хибер просто не видет изменений и ничего не делает. Наверняка можно написать метод для удаления с нативным сиквель запросом или придумать еще какие-то костыли, но хочется сделать это средствами CrudRepository без свистоплясок. Покажите направление куда копать, товарищи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2015, 20:50 |
|
||
|
[Hibernate] Many to Many - Delete record from Join Table by Id
|
|||
|---|---|---|---|
|
#18+
mephЕсли удаляю через Long: Код: java 1. то получаю Код: java 1. Вроде бы логично, но у CrudRepository не метода удаления с таким параметром. Стоит ли его создать самому, или же это идеологически неверно? Если улаляю через Comment Код: java 1. то Хибер просто не видет изменений и ничего не делает. А что с вариантом удаления непосредственно по PK? Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 11:03 |
|
||
|
[Hibernate] Many to Many - Delete record from Join Table by Id
|
|||
|---|---|---|---|
|
#18+
BlazkowiczА что с вариантом удаления непосредственно по PK? Код: java 1. Это первое, что пришло в голову после того, как удаление через Long не сработало. Однако commentRepository (он же CrudRepository) из коробки умеет удалять либо через Long, либо через Comment. Стоит ли мне добавить в commentRepository метод delete(CommentID сommentID) ? Хотелось бы понять в правильном ли направлении я двигаюсь, или же такой подход выглядит совсем не кошерно? Как принято в ваших этих Спрингах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 17:22 |
|
||
|
[Hibernate] Many to Many - Delete record from Join Table by Id
|
|||
|---|---|---|---|
|
#18+
meph, А почему вас CrudRepository<Comment, Long> вместо CrudRepository<Comment, CommentID> ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 17:33 |
|
||
|
[Hibernate] Many to Many - Delete record from Join Table by Id
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, отличный вопрос :) конечно же ваша правда, не знаю чем я думал, когда оставил там Long. Исправил CommentRepository: Код: java 1. 2. 3. 4. В контроллере метод выглядит так (не могу сказать, что мне нравится цикл, ну да ладно): Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. К сожалению, запись по-прежнему не удаляется. Логи выглядят немного подозрительно, особенно в месте Listing entities. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 18:28 |
|
||
|
[Hibernate] Many to Many - Delete record from Join Table by Id
|
|||
|---|---|---|---|
|
#18+
meph, Ну, вот, теперь мы дошли до старых добрых Hibernate ORM граблей. Дело в том что у вас явно грузится коллекция комментариев. Поэтому нужно удалить коментарий из коллекции, а не коментарий по id. В идеале код должен выглядеть так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 19:04 |
|
||
|
[Hibernate] Many to Many - Delete record from Join Table by Id
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Код: java 1. По-моему предикат как-то покрасивее можно оформить, но что-то под вечер уже не соображаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 19:13 |
|
||
|
[Hibernate] Many to Many - Delete record from Join Table by Id
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Для начала пофиксить инкапсуляцию: Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 19:20 |
|
||
|
[Hibernate] Many to Many - Delete record from Join Table by Id
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Код: java 1. 2. 3. return профтыкал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 19:33 |
|
||
|
[Hibernate] Many to Many - Delete record from Join Table by Id
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Спасибо еще раз за помощь. Значит придется удалять через коллекции, а не старым дедовским SQL подходом. Кажется мне нужно что-то почитать на эту тему, а то я уже поплыл на таком простом примере. Я оставил ваш первый вариант с "c -> c.getPk().getId().equals(commentId)", а красивости потом можно навести. Тем не менее запись по-прежнему осталась в таблице. Сам вызов deleteComment отработал как надо, вернув true. Нужно ли вызвать save() для ticket? Или проблема в том, что User ссылается на ту же самую коллекцию? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 19:55 |
|
||
|
[Hibernate] Many to Many - Delete record from Join Table by Id
|
|||
|---|---|---|---|
|
#18+
Да. Можно save вызвать. Но по идее, если метод контроллера пометить @Transactional тогда не нужно. Dirty check должен отработать и закомитить изменения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2015, 20:09 |
|
||
|
[Hibernate] Many to Many - Delete record from Join Table by Id
|
|||
|---|---|---|---|
|
#18+
Потыкал еще пару раз через RestClient Plugin, так ничего и не удалялось. Через полчаса Штирлиц вспомнил про отсутсвие orphanRemoval=true в @OneToMany аннотации, и все заработало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2015, 00:52 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39117727&tid=2124610]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
158ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 477ms |

| 0 / 0 |
