|
|
|
Hibernate мапинг с фильтром
|
|||
|---|---|---|---|
|
#18+
Есть 2 сущности Product и Properties. Товар и его свойства. Периодически свойства товара меняются, но разные люди работают с разными, так сказать версиями товара. Т.е. на складе есть товар версии1 со своими свойствами и товар версии2 со своими совйствами. Для этого в Product и в Properties добавили поле version. И разные люди должны при выборке "Покажи товар c ID=3, версии 1" и "Покажи товар с ID=3, версии 2", получить Product с соответствующими фильтрами. Пока все было маленькое и использовали обычный SQL, все было хорошо. Просто в запрос добавлялся условие по версии, все работало. Но теперь такое надо сделать в Hibernate. Для любителей порассуждать на тему правильных сферических коней в вакууме поясню. Это не реальный пример, просто воспроизведена техническая ситуация. Так вот, как в мапинг @ManyToOne для Properties, добавить условие, что версия Properties должна быть равна версии Product? Код: 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. В запросе NamedQuery, легко добавляется параметр версия. Но при этом в список пропертей, попадают проперти от всех версий. Как туда тоже добавить фильтр по версии? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 13:22 |
|
||
|
Hibernate мапинг с фильтром
|
|||
|---|---|---|---|
|
#18+
Да, забыл сказать. Envers хибернейтовский не канает, по самым разным причинам. Его уже рассматривали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 13:23 |
|
||
|
Hibernate мапинг с фильтром
|
|||
|---|---|---|---|
|
#18+
У вас есть некоторая бизнес-логика, связаная с версионностью структуры. В чем глубинный смысл зашивать эту бизнес-логику в слой работы ORM, а не реализовать отдельным наружным слоем, оставив ORM лишь инструментом работы с моделью заданной БД? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 13:40 |
|
||
|
Hibernate мапинг с фильтром
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, +1 аффтра. Вы сказали, что раньше - работало. Покажите модель БД когда работало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 13:41 |
|
||
|
Hibernate мапинг с фильтром
|
|||
|---|---|---|---|
|
#18+
BlazkowiczУ вас есть некоторая бизнес-логика, связаная с версионностью структуры. В чем глубинный смысл зашивать эту бизнес-логику в слой работы ORM, а не реализовать отдельным наружным слоем, оставив ORM лишь инструментом работы с моделью заданной БД? Т.е. как это в чем смысл? Надо же хранить версии и работать с ними. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 13:53 |
|
||
|
Hibernate мапинг с фильтром
|
|||
|---|---|---|---|
|
#18+
Petro123Blazkowicz, +1 аффтра. Вы сказали, что раньше - работало. Покажите модель БД когда работало. Оно не когда-то работало, оно и сейчас работает. Без хибернейта. Но вот опять. Не надо обсуждать модель. Это не реальный пример, выдумка, фантазии... не знаю как еще это объяснить... Пример привел просто чтобы показать техническую проблему, а не архитектуру. Вопрос был не "как мне сделать версионность", а "как за мапить с доп условиями". Зачем флудить, уходя в дебри не заданного вопроса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 13:56 |
|
||
|
Hibernate мапинг с фильтром
|
|||
|---|---|---|---|
|
#18+
Ищущий ЗнанияНадо же хранить версии и работать с ними. вам не уйти от "сферического коня" по вашему определению. - зачем хранить? - как работать? - почему именно версия товара? IMHO коряво выглядит этот термин. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 13:56 |
|
||
|
Hibernate мапинг с фильтром
|
|||
|---|---|---|---|
|
#18+
Ищущий Знанияа "как за мапить с доп условиями". хибер маппит Реальную БД и таблицы. Т.е. DAO зеркало БД. А потом в сервисном слое подменяй свои версии объектов. IMHO об этом тебе и было сказано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 13:57 |
|
||
|
Hibernate мапинг с фильтром
|
|||
|---|---|---|---|
|
#18+
Petro123Ищущий ЗнанияНадо же хранить версии и работать с ними. вам не уйти от "сферического коня" по вашему определению. - зачем хранить? - как работать? - почему именно версия товара? IMHO коряво выглядит этот термин. Ну вы даете)) 1. Как это зачем хранить? Ну вот бизнесу надо хранить версии... мне им сказать чтоб не хотели и выкинули базу за последние несколько лет с версиями? 2. Как работать вопрос не стоит. Уже работают и проблем с этим нет. 3. Может название и корявое, но отражает реальность. Это изменения свойств объекта во времени. Все привыкли называть это версиями. Не вижу тут никакой проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 14:01 |
|
||
|
Hibernate мапинг с фильтром
|
|||
|---|---|---|---|
|
#18+
IMHO почти твоя модель, т.к. ты ничего не привёл кроме общих фраз: Из этой модели: http://www.sql.ru/forum/954709-1/shema-spravochnika-tovarov-i-atributov?hl=???????? ?????? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. в твою версию модели Аспирин +- Аспирин 10 | +- Аспирин Россия | | +- Аспирин версии1 | | +- Аспирин версии2 Ты схему БД так и не привёл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 14:02 |
|
||
|
Hibernate мапинг с фильтром
|
|||
|---|---|---|---|
|
#18+
Petro123Ищущий Знанияа "как за мапить с доп условиями". хибер маппит Реальную БД и таблицы. Т.е. DAO зеркало БД. А потом в сервисном слое подменяй свои версии объектов. IMHO об этом тебе и было сказано. Может конкретно описать, безо всяких заклинаний типа "сделай DAO в сервисе"? Вы предлагаете извлекать связанные таблицы не хибернейтом, а руками? Сначала выбирать товар, потом отдельно выбирать проперти к нему и руками их соединять, отказавшись от мапинга в хибернейте? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 14:03 |
|
||
|
Hibernate мапинг с фильтром
|
|||
|---|---|---|---|
|
#18+
Ищущий Знаниябизнесу надо хранить версии... мне им сказать чтоб не хотели и выкинули базу за последние несколько лет с версиями? смешно. Если "хранить" - термин от бизнеса , то есть - OLAP\OLTP бэкапы и СиДиРОМы наконец)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 14:04 |
|
||
|
Hibernate мапинг с фильтром
|
|||
|---|---|---|---|
|
#18+
Ищущий ЗнанияМожет конкретно описать, As Is To Be - дай схему и запросы КАК РАБОТАЛО ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 14:05 |
|
||
|
Hibernate мапинг с фильтром
|
|||
|---|---|---|---|
|
#18+
либо выбери другой пример. Например - СЭД и версии документов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 14:07 |
|
||
|
Hibernate мапинг с фильтром
|
|||
|---|---|---|---|
|
#18+
По-правильному, если в продукте раньше был ключ product_id, то теперь он должен стать составным (product_id, version), то же относится и к внешнему кючу в Properties. В хибернейте для этого создают специальный класс, в учебнике всё подробно расписано. Судя по тому, что нарисовано, ключ так и остался product_id, то есть ваша таблица сейчас даже не во 2 нормальной форме. Хибернейт с такими таблицами работать не может, разве что с применением костылей. Сделайте нормальный меппинг ключей и всё заработает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 14:07 |
|
||
|
Hibernate мапинг с фильтром
|
|||
|---|---|---|---|
|
#18+
Petro123IMHO почти твоя модель, т.к. ты ничего не привёл кроме общих фраз: Т.е. конкретный код, который я привел это "ничего" ? Он полностью описывает ситуацию. Там всего 2 таблицы с двумя полями. Ну ладно, в базе будет так: Product - Аспирин версии1 - Аспирин версии2 - Аспирин версии3 Properties - Свойство 1, Аспирин версии1 - Свойство 2, Аспирин версии1 - Свойство 1, Аспирин версии3 - Свойство 2, Аспирин версии3 - Свойство 3, Аспирин версии3 Никаких деревьев там нет. Без хибернейта делается просто join табличек с фильтром по версии. Но опять же, зачем это? Вопрос был не архитектурный. Вопрос чисто по хибернейту, как добавить в мапинг табличек доп условие по полю... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 14:16 |
|
||
|
Hibernate мапинг с фильтром
|
|||
|---|---|---|---|
|
#18+
Petro123Ищущий Знаниябизнесу надо хранить версии... мне им сказать чтоб не хотели и выкинули базу за последние несколько лет с версиями? смешно. Если "хранить" - термин от бизнеса , то есть - OLAP\OLTP бэкапы и СиДиРОМы наконец)) Действительно смешно... Кто хранит справочник товаров в бекапе на сидироме? Хватит стебаться уже... Если нечего сказать по делу, лучше не надо флудить и показывать какой вы "умный"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 14:21 |
|
||
|
Hibernate мапинг с фильтром
|
|||
|---|---|---|---|
|
#18+
ivanraПо-правильному, если в продукте раньше был ключ product_id, то теперь он должен стать составным (product_id, version), то же относится и к внешнему кючу в Properties. В хибернейте для этого создают специальный класс, в учебнике всё подробно расписано. Судя по тому, что нарисовано, ключ так и остался product_id, то есть ваша таблица сейчас даже не во 2 нормальной форме. Хибернейт с такими таблицами работать не может, разве что с применением костылей. Сделайте нормальный меппинг ключей и всё заработает Спасибо. Хоть кто-то пишет по делу... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 14:23 |
|
||
|
Hibernate мапинг с фильтром
|
|||
|---|---|---|---|
|
#18+
Ищущий ЗнанияivanraПо-правильному, если в продукте раньше был ключ product_id, то теперь он должен стать составным (product_id, version), то же относится и к внешнему кючу в Properties. В хибернейте для этого создают специальный класс, в учебнике всё подробно расписано. Судя по тому, что нарисовано, ключ так и остался product_id, то есть ваша таблица сейчас даже не во 2 нормальной форме. Хибернейт с такими таблицами работать не может, разве что с применением костылей. Сделайте нормальный меппинг ключей и всё заработает Спасибо. Хоть кто-то пишет по делу... да. Привели бы схему БД с ID - давно бы всё было ясно. Упрямый)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 14:28 |
|
||
|
Hibernate мапинг с фильтром
|
|||
|---|---|---|---|
|
#18+
А так работать будет? @ManyToOne @JoinColumns({ @JoinColumn(name = "product_id", referencedColumnName="ID"), @JoinColumn(name="version", referencedColumnName="version") }) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 14:30 |
|
||
|
Hibernate мапинг с фильтром
|
|||
|---|---|---|---|
|
#18+
PsolaoА так работать будет? @ManyToOne @JoinColumns({ @JoinColumn(name = "product_id", referencedColumnName="ID"), @JoinColumn(name="version", referencedColumnName="version") }) Неа, так не работает, уже попробовал. Говорит не может быть 2 поля "version". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 16:07 |
|
||
|
Hibernate мапинг с фильтром
|
|||
|---|---|---|---|
|
#18+
Petro123да. Привели бы схему БД с ID - давно бы всё было ясно. Упрямый)) Для тех кто реально может помочь, все понятно. А тем кто только и умеет что выпячивать собственную значимость, всегда что-то мешает... про танцора ведь в курсе? ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 16:08 |
|
||
|
Hibernate мапинг с фильтром
|
|||
|---|---|---|---|
|
#18+
Ищущий ЗнанияPsolaoА так работать будет? @ManyToOne @JoinColumns({ @JoinColumn(name = "product_id", referencedColumnName="ID"), @JoinColumn(name="version", referencedColumnName="version") }) Неа, так не работает, уже попробовал. Говорит не может быть 2 поля "version". Все нормально - убери из основного класса поле version ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 16:24 |
|
||
|
Hibernate мапинг с фильтром
|
|||
|---|---|---|---|
|
#18+
PsolaoВсе нормально - убери из основного класса поле version Я чего-то не понимаю... Если я уберу это поле из основного класса, то как я буду узнавать его версию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2014, 16:27 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38540784&tid=2127738]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
182ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
| others: | 234ms |
| total: | 529ms |

| 0 / 0 |
