Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate мапинг с фильтром / 25 сообщений из 49, страница 1 из 2
28.01.2014, 13:22
    #38540410
Hibernate мапинг с фильтром
Есть 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.
@Entity
@Table(name = "properties")
public class Properties {
    @ManyToOne( fetch = FetchType.LAZY )
    @JoinColumn( name = "product_id" )
    private Product product;

    @Column( name = "version" )
    private int version;
}

@Entity
@Table(name = "product")
@NamedQueries({
        @NamedQuery(name = "get.product.by.ver",
                query = "SELECT q " +
                        "FROM Product p " +
                        "WHERE p.version = :version ")
})
public class Product {
    @OneToMany( fetch = FetchType.LAZY, mappedBy = "product" )
    private List<Properties> properties = new ArrayList<>();

    @Column( name = "version" )
    private int version;
}



В запросе NamedQuery, легко добавляется параметр версия. Но при этом в список пропертей, попадают проперти от всех версий. Как туда тоже добавить фильтр по версии?
...
Рейтинг: 0 / 0
28.01.2014, 13:23
    #38540414
Hibernate мапинг с фильтром
Да, забыл сказать. Envers хибернейтовский не канает, по самым разным причинам. Его уже рассматривали.
...
Рейтинг: 0 / 0
28.01.2014, 13:40
    #38540443
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate мапинг с фильтром
У вас есть некоторая бизнес-логика, связаная с версионностью структуры.
В чем глубинный смысл зашивать эту бизнес-логику в слой работы ORM, а не реализовать отдельным наружным слоем, оставив ORM лишь инструментом работы с моделью заданной БД?
...
Рейтинг: 0 / 0
28.01.2014, 13:41
    #38540447
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate мапинг с фильтром
Blazkowicz,
+1
аффтра. Вы сказали, что раньше - работало. Покажите модель БД когда работало.
...
Рейтинг: 0 / 0
28.01.2014, 13:53
    #38540471
Hibernate мапинг с фильтром
BlazkowiczУ вас есть некоторая бизнес-логика, связаная с версионностью структуры.
В чем глубинный смысл зашивать эту бизнес-логику в слой работы ORM, а не реализовать отдельным наружным слоем, оставив ORM лишь инструментом работы с моделью заданной БД?
Т.е. как это в чем смысл? Надо же хранить версии и работать с ними.
...
Рейтинг: 0 / 0
28.01.2014, 13:56
    #38540478
Hibernate мапинг с фильтром
Petro123Blazkowicz,
+1
аффтра. Вы сказали, что раньше - работало. Покажите модель БД когда работало.

Оно не когда-то работало, оно и сейчас работает. Без хибернейта.
Но вот опять. Не надо обсуждать модель. Это не реальный пример, выдумка, фантазии... не знаю как еще это объяснить...
Пример привел просто чтобы показать техническую проблему, а не архитектуру.
Вопрос был не "как мне сделать версионность", а "как за мапить с доп условиями".
Зачем флудить, уходя в дебри не заданного вопроса?
...
Рейтинг: 0 / 0
28.01.2014, 13:56
    #38540479
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate мапинг с фильтром
Ищущий ЗнанияНадо же хранить версии и работать с ними.
вам не уйти от "сферического коня" по вашему определению.
- зачем хранить?
- как работать?
- почему именно версия товара? IMHO коряво выглядит этот термин.
...
Рейтинг: 0 / 0
28.01.2014, 13:57
    #38540482
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate мапинг с фильтром
Ищущий Знанияа "как за мапить с доп условиями".
хибер маппит Реальную БД и таблицы.
Т.е. DAO зеркало БД.
А потом в сервисном слое подменяй свои версии объектов.
IMHO об этом тебе и было сказано.
...
Рейтинг: 0 / 0
28.01.2014, 14:01
    #38540485
Hibernate мапинг с фильтром
Petro123Ищущий ЗнанияНадо же хранить версии и работать с ними.
вам не уйти от "сферического коня" по вашему определению.
- зачем хранить?
- как работать?
- почему именно версия товара? IMHO коряво выглядит этот термин.

Ну вы даете))
1. Как это зачем хранить? Ну вот бизнесу надо хранить версии... мне им сказать чтоб не хотели и выкинули базу за последние несколько лет с версиями?

2. Как работать вопрос не стоит. Уже работают и проблем с этим нет.

3. Может название и корявое, но отражает реальность. Это изменения свойств объекта во времени. Все привыкли называть это версиями. Не вижу тут никакой проблемы.
...
Рейтинг: 0 / 0
28.01.2014, 14:02
    #38540489
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate мапинг с фильтром
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
|  +- Аспирин Россия
|  |  +- Аспирин московский
|  |  +- Аспирин пермский
|  +- Аспирин заграничный
|     +- Аспирин У ПСА
|     +- Аспирин байеровский
+- Аспирин растворимый


в твою версию модели
Аспирин
+- Аспирин 10
| +- Аспирин Россия
| | +- Аспирин версии1
| | +- Аспирин версии2

Ты схему БД так и не привёл
...
Рейтинг: 0 / 0
28.01.2014, 14:03
    #38540491
Hibernate мапинг с фильтром
Petro123Ищущий Знанияа "как за мапить с доп условиями".
хибер маппит Реальную БД и таблицы.
Т.е. DAO зеркало БД.
А потом в сервисном слое подменяй свои версии объектов.
IMHO об этом тебе и было сказано.

Может конкретно описать, безо всяких заклинаний типа "сделай DAO в сервисе"?
Вы предлагаете извлекать связанные таблицы не хибернейтом, а руками?
Сначала выбирать товар, потом отдельно выбирать проперти к нему и руками их соединять, отказавшись от мапинга в хибернейте?
...
Рейтинг: 0 / 0
28.01.2014, 14:04
    #38540494
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate мапинг с фильтром
Ищущий Знаниябизнесу надо хранить версии... мне им сказать чтоб не хотели и выкинули базу за последние несколько лет с версиями?
смешно.
Если "хранить" - термин от бизнеса , то есть - OLAP\OLTP бэкапы и СиДиРОМы наконец))
...
Рейтинг: 0 / 0
28.01.2014, 14:05
    #38540499
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate мапинг с фильтром
Ищущий ЗнанияМожет конкретно описать,
As Is To Be - дай схему и запросы КАК РАБОТАЛО
...
Рейтинг: 0 / 0
28.01.2014, 14:07
    #38540503
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate мапинг с фильтром
либо выбери другой пример. Например - СЭД и версии документов.
...
Рейтинг: 0 / 0
28.01.2014, 14:07
    #38540504
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate мапинг с фильтром
По-правильному, если в продукте раньше был ключ product_id, то теперь он должен стать составным (product_id, version), то же относится и к внешнему кючу в Properties. В хибернейте для этого создают специальный класс, в учебнике всё подробно расписано.
Судя по тому, что нарисовано, ключ так и остался product_id, то есть ваша таблица сейчас даже не во 2 нормальной форме. Хибернейт с такими таблицами работать не может, разве что с применением костылей.
Сделайте нормальный меппинг ключей и всё заработает
...
Рейтинг: 0 / 0
28.01.2014, 14:16
    #38540519
Hibernate мапинг с фильтром
Petro123IMHO почти твоя модель, т.к. ты ничего не привёл кроме общих фраз:
Т.е. конкретный код, который я привел это "ничего" ?
Он полностью описывает ситуацию. Там всего 2 таблицы с двумя полями.

Ну ладно, в базе будет так:
Product
- Аспирин версии1
- Аспирин версии2
- Аспирин версии3

Properties
- Свойство 1, Аспирин версии1
- Свойство 2, Аспирин версии1
- Свойство 1, Аспирин версии3
- Свойство 2, Аспирин версии3
- Свойство 3, Аспирин версии3

Никаких деревьев там нет.
Без хибернейта делается просто join табличек с фильтром по версии.
Но опять же, зачем это? Вопрос был не архитектурный.
Вопрос чисто по хибернейту, как добавить в мапинг табличек доп условие по полю...
...
Рейтинг: 0 / 0
28.01.2014, 14:21
    #38540526
Hibernate мапинг с фильтром
Petro123Ищущий Знаниябизнесу надо хранить версии... мне им сказать чтоб не хотели и выкинули базу за последние несколько лет с версиями?
смешно.
Если "хранить" - термин от бизнеса , то есть - OLAP\OLTP бэкапы и СиДиРОМы наконец))
Действительно смешно...
Кто хранит справочник товаров в бекапе на сидироме?
Хватит стебаться уже...
Если нечего сказать по делу, лучше не надо флудить и показывать какой вы "умный"...
...
Рейтинг: 0 / 0
28.01.2014, 14:23
    #38540532
Hibernate мапинг с фильтром
ivanraПо-правильному, если в продукте раньше был ключ product_id, то теперь он должен стать составным (product_id, version), то же относится и к внешнему кючу в Properties. В хибернейте для этого создают специальный класс, в учебнике всё подробно расписано.
Судя по тому, что нарисовано, ключ так и остался product_id, то есть ваша таблица сейчас даже не во 2 нормальной форме. Хибернейт с такими таблицами работать не может, разве что с применением костылей.
Сделайте нормальный меппинг ключей и всё заработает

Спасибо.
Хоть кто-то пишет по делу...
...
Рейтинг: 0 / 0
28.01.2014, 14:28
    #38540545
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate мапинг с фильтром
Ищущий ЗнанияivanraПо-правильному, если в продукте раньше был ключ product_id, то теперь он должен стать составным (product_id, version), то же относится и к внешнему кючу в Properties. В хибернейте для этого создают специальный класс, в учебнике всё подробно расписано.
Судя по тому, что нарисовано, ключ так и остался product_id, то есть ваша таблица сейчас даже не во 2 нормальной форме. Хибернейт с такими таблицами работать не может, разве что с применением костылей.
Сделайте нормальный меппинг ключей и всё заработает

Спасибо.
Хоть кто-то пишет по делу...
да.
Привели бы схему БД с ID - давно бы всё было ясно.
Упрямый))
...
Рейтинг: 0 / 0
28.01.2014, 14:30
    #38540548
Psolao
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate мапинг с фильтром
А так работать будет?
@ManyToOne
@JoinColumns({
@JoinColumn(name = "product_id", referencedColumnName="ID"),
@JoinColumn(name="version", referencedColumnName="version")
})
...
Рейтинг: 0 / 0
28.01.2014, 16:07
    #38540737
Hibernate мапинг с фильтром
PsolaoА так работать будет?
@ManyToOne
@JoinColumns({
@JoinColumn(name = "product_id", referencedColumnName="ID"),
@JoinColumn(name="version", referencedColumnName="version")
})

Неа, так не работает, уже попробовал. Говорит не может быть 2 поля "version".
...
Рейтинг: 0 / 0
28.01.2014, 16:08
    #38540739
Hibernate мапинг с фильтром
Petro123да.
Привели бы схему БД с ID - давно бы всё было ясно.
Упрямый))

Для тех кто реально может помочь, все понятно.
А тем кто только и умеет что выпячивать собственную значимость, всегда что-то мешает... про танцора ведь в курсе? ;)
...
Рейтинг: 0 / 0
28.01.2014, 16:24
    #38540774
Psolao
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate мапинг с фильтром
Ищущий ЗнанияPsolaoА так работать будет?
@ManyToOne
@JoinColumns({
@JoinColumn(name = "product_id", referencedColumnName="ID"),
@JoinColumn(name="version", referencedColumnName="version")
})

Неа, так не работает, уже попробовал. Говорит не может быть 2 поля "version".

Все нормально - убери из основного класса поле version
...
Рейтинг: 0 / 0
28.01.2014, 16:27
    #38540784
Hibernate мапинг с фильтром
PsolaoВсе нормально - убери из основного класса поле version
Я чего-то не понимаю... Если я уберу это поле из основного класса, то как я буду узнавать его версию?
...
Рейтинг: 0 / 0
28.01.2014, 16:32
    #38540796
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate мапинг с фильтром
Ищущий Знания,
чукча не читатель.
Маппинг всегда 2 стороны - Код Java и схема БД.
Изучай-ищи дальше), я не против).
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate мапинг с фильтром / 25 сообщений из 49, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]