![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| v2v |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1620 Регистрация: 20.9.2006 Где: Киев Репутация: 9 Всего: 56 |
-- Имеем следующую задачу. Есть сущность "компьютер", которой соответсвует таблица "Computer" в базе данных. Компьютер состоит из элементов(блоков) разных типов: монитор, клавиатура, мишь и т.д. Каждому типу соответсвует своя таблица в бд Monitor, Keyboard, Mouse. Все компоненты компьютера наследуются от абстрактной сущности AbstractBlock. В мапинге указан отношение 1 компьютер ко многим AbstractBlock, но понятно что в массиве blocks находятся не абстрактные сущности, а реальные компоненты мыши, клавиатуры ит.д. Проблема в генерящимся NamedQuery для компьютера. Дело в том что он не понимает что хоть и мапимся мы на абстрактную сущность, реальная выборка должна происходить из сущностей-наследников. В итоге получаем следующий неправильный запрос:
Таблички AbstractBlock не существует (см. стратегию наследования TABLE_PER_CLASS). Хотелось бы что бы сгенерился запрос в виде:
Как можно этого добиться? |
||||||
|
|||||||
| firedrago |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 170 Регистрация: 22.9.2005 Репутация: 1 Всего: 3 |
http://en.wikibooks.org/wiki/Java_Persistence/Inheritance
именно по этому я всегда использую InheritanceType.JOINED .... контроль за PKey и т.д. в твоем бы случае было бы
и никакого гимороя... удачи! Это сообщение отредактировал(а) firedrago - 28.8.2010, 15:58 |
||||
|
|||||
| v2v |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1620 Регистрация: 20.9.2006 Где: Киев Репутация: 9 Всего: 56 |
при указанном запросе всё равно будет "лажа":
после того как запрос вытащит сущность "компьютер", он начинает ходить по связанным таблицам и вытаскивать дополнительные сущности, при чём опять не обращая внимание на наследование:
|
||||
|
|||||
| firedrago |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 170 Регистрация: 22.9.2005 Репутация: 1 Всего: 3 |
При Lazy твои блокс будут вытаскиваться толко когда ты к ним обратишся... Поставь Eager и они будут вытаскиваться сразу. |
|||
|
||||
| v2v |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1620 Регистрация: 20.9.2006 Где: Киев Репутация: 9 Всего: 56 |
firedrago, ты не понял. То что оно потом вытаскивает - это Ок. Проблема в том, что оно вытаскивает из не существующей таблицы AbstracBlock, когда должно обращаться к дочерним сущностям.
|
|||
|
||||
| firedrago |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 170 Регистрация: 22.9.2005 Репутация: 1 Всего: 3 |
я не уверен, что без AbstractBlock table оно у тебя будет работать..... даже теоретически не представляю как он должен следить за PK.... например в случае с JOINED всегда есть таблица из Abstract класса..... в ней есть PK(id) и DTYPE(тип твоих классов унаследовавшие Abstract).... таблица наследника FK(id) и все, что ты в объекте еще засунул.... вобщем мое мнение, что без таблицы Abstract ничего не выйдет..... |
|||
|
||||
| firedrago |
|
||||||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 170 Регистрация: 22.9.2005 Репутация: 1 Всего: 3 |
так .... только что попробывал - все работает, но без таблицы AbstractBlocks не обойтись...
использовал EclipseLink итак классы :
!!!!!! Entity "AbstractBlock" uses table-per-concrete-class inheritance which is not portable and may not be supported by the JPA provider
создаем записываем и читаем через query...
смотрим консоль...
CREATE TABLE ABSTRACTBLOCK (COMPUTER_ID INTEGER) - автоматом..... как видно, все блоки нашел.... |
||||||||||||
|
|||||||||||||
| firedrago |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 170 Регистрация: 22.9.2005 Репутация: 1 Всего: 3 |
к стати еще одна злая ошибка
поменяй
на
иначе он не будет записывать ID в базу и все-таки лучше использовать JOINED..... удачи! Это сообщение отредактировал(а) firedrago - 29.8.2010, 20:00 |
||||
|
|||||
| v2v |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1620 Регистрация: 20.9.2006 Где: Киев Репутация: 9 Всего: 56 |
странно как то ... TABLE_PER_CLASS наследование, как то слишком в таком случае на JOINED смахивает.
Но всё равно спасибо за помощь, посмотрю что можно сделать. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |