|
|
|
[Hibernate] Эмуляция связи многие-ко-многим (связующая таблица с параметром)
|
|||
|---|---|---|---|
|
#18+
В принципе, это не эмуляция, а ручное создание такой связи через вручную созданную связующую таблицу. Назвал эмуляцией, потому что нужна не двунаправленная связь, а только лишь связка в этой связующей таблице. Связываю объекты Box и Pen. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Связующую таблицу делаю так: Код: 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. В контроллере создаю объект boxPen и записываю: Код: java 1. 2. 3. 4. 5. 6. 7. Непосредственно при записи получаю лог запросов и исключение: авторHibernate: select boxpen0_.box_id as box1_21_0_, boxpen0_.pen_id as pen2_21_0_, boxpen0_.color as color21_0_ from box__pen boxpen0_ where boxpen0_.box_id=? and boxpen0_.pen_id=? Hibernate: select box0_.id as id20_1_, ..., from box box0_ where box0_.id=? Hibernate: insert into box__pen(color, pen_id, box_id) values (?, ?, ?) 11:38:52,691 WARN SqlExceptionHelper:143 - SQL Error: 0, SQLState: S1093 11:38:52,691 ERROR SqlExceptionHelper:144 - The index 4 is out of range. com.microsoft.sqlserver.jdbc.SQLServerException: The index 4 is out of range. Попытка вставлять сразу id вместо объектов только выдает аналогичное исключение, не делая запросы. Попробовал перейти к "элегантному" описанию связующей таблицы: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Создаю и записываю экземпляр: авторHibernate: select boxpen0_.box_id as box2_21_0_, boxpen0_.pen_id as pen3_21_0_, boxpen0_.color as color21_0_ from box__pen boxpen0_ where boxpen0_.box_id=? and boxpen0_.pen_id=? Hibernate: insert into box__pen (color, box_id, pen_id) values (?, ?, ?) 11:49:51,738 WARN SqlExceptionHelper:143 - SQL Error: 515, SQLState: 23000 11:49:51,738 ERROR SqlExceptionHelper:144 - Cannot insert the value NULL into column 'box_id', table 'sdb.dbo.box__pen'; column does not allow nulls. INSERT fails. 7 лист 2012 11:49:51 org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet [springmvc] in context with path [/work] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: Cannot insert the value NULL into column 'box_id', table 'sdb.dbo.box__pen'; column does not allow nulls. INSERT fails.; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: Cannot insert the value NULL into column 'box_id', table 'sdb.dbo.box__pen'; column does not allow nulls. INSERT fails.] with root cause com.microsoft.sqlserver.jdbc.SQLServerException: Cannot insert the value NULL into column 'box_id', table 'sdb.dbo.box__pen'; column does not allow nulls. INSERT fails. Если реализовать в объектах Box и Pen обратные связи @OneToMany, то все нормально работает. А, да, добавление или удаление атрибутов "insertable = false" и "updatable = false" ни к чему не приводят. Прошу помощи в решении данного вопроса. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2012, 13:59:48 |
|
||
|
[Hibernate] Эмуляция связи многие-ко-многим (связующая таблица с параметром)
|
|||
|---|---|---|---|
|
#18+
IDVsbruck, Чем не нравится классика и зачем велосипед, ты так и не ответил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2012, 14:45:18 |
|
||
|
[Hibernate] Эмуляция связи многие-ко-многим (связующая таблица с параметром)
|
|||
|---|---|---|---|
|
#18+
Ну, давай отталкиваться от того, что мне хочется реализовать составной внешний ключ, пусть для самообразования, а он не поддается. Все вводные привел, получаю исключения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2012, 15:03:35 |
|
||
|
[Hibernate] Эмуляция связи многие-ко-многим (связующая таблица с параметром)
|
|||
|---|---|---|---|
|
#18+
авторCannot insert the value NULL into column 'box_id', table 'sdb.dbo.box__pen'; column does not allow nullsсделать поле box_id nullable делофто ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2012, 15:20:22 |
|
||
|
[Hibernate] Эмуляция связи многие-ко-многим (связующая таблица с параметром)
|
|||
|---|---|---|---|
|
#18+
Не, "Allow Nulls property cannot be set on a column which is part of the primary key". Через Entity если проставить nullable = true просто проходит компиляция, но ключевые поля, само собой, "Not Allows NULL". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2012, 15:59:51 |
|
||
|
[Hibernate] Эмуляция связи многие-ко-многим (связующая таблица с параметром)
|
|||
|---|---|---|---|
|
#18+
дак следующий же вывод очень простой убери @id из второго варианта boxPen ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2012, 16:27:27 |
|
||
|
[Hibernate] Эмуляция связи многие-ко-многим (связующая таблица с параметром)
|
|||
|---|---|---|---|
|
#18+
Тогда нельзя откомпилировать - требует наличие идентефикатора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2012, 16:31:31 |
|
||
|
[Hibernate] Эмуляция связи многие-ко-многим (связующая таблица с параметром)
|
|||
|---|---|---|---|
|
#18+
IDVsbruckТогда нельзя откомпилировать - требует наличие идентефикатора. сделай идентификатор ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2012, 16:45:37 |
|
||
|
[Hibernate] Эмуляция связи многие-ко-многим (связующая таблица с параметром)
|
|||
|---|---|---|---|
|
#18+
Согласен, костыли можно всякие вставлять. Но почему такая проблема с составным внешним ключом? - Ведь все должно быть просто и примитивно! Прям фигня какая-то! - Уже такие пляски с бубном устраиваю ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2012, 19:55:58 |
|
||
|
[Hibernate] Эмуляция связи многие-ко-многим (связующая таблица с параметром)
|
|||
|---|---|---|---|
|
#18+
IDVsbruck, Составные это геморрой т.к отсутствует первичный ключ PK в обоих таблицах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2012, 20:38:04 |
|
||
|
[Hibernate] Эмуляция связи многие-ко-многим (связующая таблица с параметром)
|
|||
|---|---|---|---|
|
#18+
IDVsbruck, маппинг с составным ключом делается так: Box, Pen - аналогично Вашему Сначало описываем ключ (Так как ключ должен быть уникальным для таблицы и реализовать Serializable (для методов get/load/save...)) Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. и потом собственно таблицу: Код: 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. в логах я увидел желаемое: Hibernate: insert into box values ( ) Hibernate: insert into pen values ( ) Hibernate: insert into BoxPen (color, box_id, pen_id) values (?, ?, ?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2012, 21:41:20 |
|
||
|
[Hibernate] Эмуляция связи многие-ко-многим (связующая таблица с параметром)
|
|||
|---|---|---|---|
|
#18+
pavel_nv, низкий поклон тебе. Я за сегодня натыкался раз 100, наверное, на то, что использовали либо такую конструкцию, либо аннотицию @ClassId. Но думал: вот дураки, используют еще один дополнительный класс. Думаю, или даже уверен, что можно выкрутиться и реализовать все в одном, но так вроде максимально кошерно. Плюс надо в классе составного идентефикатора переопределить hashCode и equals, а также для удобства можно добавить Transient поля для зависимых сущностей, дабы скрыть от контроллера удлинившуюся цепочку полей и методов, хотя в HQL-запросе все-таки надо строить полную цепь. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2012, 22:45:34 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=261&tid=2130624]: |
0ms |
get settings: |
15ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
18ms |
get forum data: |
6ms |
get page messages: |
86ms |
get tp. blocked users: |
2ms |
| others: | 275ms |
| total: | 460ms |

| 0 / 0 |
