powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate - возможно ли сделать join на основе вычисляемого значения (не колонки таблицы)?
2 сообщений из 2, страница 1 из 1
Hibernate - возможно ли сделать join на основе вычисляемого значения (не колонки таблицы)?
    #33800234
kotikkk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может кто знает где можно поглядеть, или сталкивался кто.
Вопрос в следующем (на примере):
1) Есть 2 таблицы - User и SuperUser. Для User и для SuperUser *классов* (не таблиц) есть Transient проперти, которые собственно и определяют тип юзера. В таблицах тип юзера не заведен - тип определяется самой таблицой. Так сложилось исторически.
2) Есть таблица Log, которая логирует заходы юзеров на сайт. В таблице Log поля:
"id, userId, userType, date"

Где userId - ссылка на User или SuperUser, точно на какую таблицу идет ссылка определяется userType-ом. Тоже сложилось исторически.

То есть тут как бы смешение - foreign key это {userId, userType}, но userType - это *не* запись в primary таблице.

У меня есть на мой взгляд естественное желание иметь в обьекте User (да и SuperUser) поле Log, которое ссылалось бы на соотв. запись в тиблице Log.
Остался один небольшой вопрос - я не знаю как это делать :)
Как мне сослаться на foreign key, если одно из полей этого ключа вычисляемое? (в моем случае вообще константа - тип юзера)

Заранее спасибо.
...
Рейтинг: 0 / 0
Hibernate - возможно ли сделать join на основе вычисляемого значения (не колонки таблицы)?
    #33807423
pretender
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С такой проблемой сталкивались. Возможно.

1) Для решения конкретно той задачи, о которой вы говорите, можно воспользоваться фильтром.

У Ваших User-ов можно сделать такие коллекции логов:
У SuperUser-а:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 
     <bag cascade="all" embed-xml="false" inverse="true" name="logs" optimistic-lock="true">
            <key column="user_id" on-delete="noaction"/>
            <one-to-many  class ="bla.bla.Log" embed-xml="true" not-found="exception"/>
            <filter name="SuperUserTypeFilter" condition=":userType=OBJECT_TYPE"/>
     </bag>

    <filter-def name="SuperUserTypeFilter">
        <filter-param name="userType" type="string"/>
    </filter-def>

У User-а
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
     <bag cascade="all" embed-xml="false" inverse="true" name="logs" optimistic-lock="true">
         <key column="user_id" on-delete="noaction"/>
         <one-to-many  class ="bla.bla.Log" embed-xml="true" not-found="exception"/>
            <filter name="UserTypeFilter" condition=":userType=OBJECT_TYPE"/>
     </bag>

    <filter-def name="UserTypeFilter">
        <filter-param name="userType" type="string"/>
    </filter-def>

Фильтры естественно нужно активировать при создании сессии (session.enableFilter). Ну и не забыть в классах User-ов создать мембер logs типа List с публичными геттером и сеттером.

2) Более того, если вы захотите из Log-объекта знать к какому именно пользователю он относится (а это Вам обязательно понадобится), то Вам поможет такой тип маппинга как any!

Делаете в маппинге log-а:
Код: plaintext
1.
2.
3.
4.
5.
6.
        <any name="user" id-type="int" meta-type="string">
            <meta-value value="TBL_SUPER_USER"  class ="SuperUser"/>
            <meta-value value="TBL_USER"  class ="User"/>
            <column name="userType"/>
            <column name="userId"/>
        </any>

В классе log-а создаете свойство user типа Object.

Если сразу не заработает, то не отчаивайтесь. Будем разбираться. У нас разработана система, в которой ведется сквозное логгирование операций над объектами (всеми) в обной таблице (классе). Так что система, построенная на фильтрах и any-ассоциациях вполне работоспособна. Есть в ней (в системе) и классы, которые организованы как у вас: типизация на базе разнесения подклассов в различные таблицы. Но это по-моему не сильно влияет именно на эту задачу.

Пробуйте. Если не получится - пишите.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate - возможно ли сделать join на основе вычисляемого значения (не колонки таблицы)?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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