powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Мапинг по уникальным полям
21 сообщений из 21, страница 1 из 1
Мапинг по уникальным полям
    #38297355
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Возник вопрос - задача :

требуется организовать мапинг не по id как это сделано по умолчанию ,а по уникальному полю:

в схемах OneToMany и ManyToMany

для примера :

сущность User : имеет уникальный праймари кей id - автоинкрементный для mysql.

Он является автоинкрементным , что не подходит для мапинга при условии что с базой будут проводиться технические работы и репликации.

для идентификации пользователя хочется использовать его уникальный user_Id - который моя система получает из другой системы.

user_id - уникален на несколько в нескольких системах на уровне постоянства.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    @Getter @Setter Long id;
 

   @Column(name = "user_id")
    @Getter @Setter Long user_id;

    @Column(name = "user_name")
    private @Getter @Setter String user_name;
 
    @Column(name = "login")
    private @Getter @Setter String login;

    @OneToMany
    private @Getter @Setter List<Phone> phones = new ArrayList<Phone>();



т.е. телефоны должны мапиться не по id ,а по user_id

так же в таблице телефонов есть уникальных phone_id - для каждого номера, помимо помимо автоинкрементного id.


второй вопрос по связке ManyToMany
в класической схеме из трех таблиц user - user_role - role

где user_role - расшифровочная таблица (класс ассоциация)

у каждого пользователя св системе могут быть разные роли (картеж)

так же у каждой роли по мимо id есть ее уникальный role_id

как описать в бинах анноацию для связи ManyToMany - на по первичному праймари ключу ?

а через уникальные поля user_id и role_id ?
...
Рейтинг: 0 / 0
Мапинг по уникальным полям
    #38297460
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
такая табличка?
id тел_id тел1 A 916-811-12-132 Б 912-123-22-1115 С 995-111-33-55
...
Рейтинг: 0 / 0
Мапинг по уникальным полям
    #38297478
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

id - int
phone_id это сам номер 79055401234 он уникален
...
Рейтинг: 0 / 0
Мапинг по уникальным полям
    #38297482
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Он является автоинкрементным , что не подходит для мапинга при условии что с базой будут проводиться технические работы и репликации.
правильно я понял что, репликация _мешает_ использовать id в табличке выше. А вот, тел_id не мешает?
...
Рейтинг: 0 / 0
Мапинг по уникальным полям
    #38297485
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,
id тел_id1 91681112132 912123221115 9951113355
так?
...
Рейтинг: 0 / 0
Мапинг по уникальным полям
    #38297489
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,
- нарисуй вторую таблу для маппинга. Кнопка формата - Table
...
Рейтинг: 0 / 0
Мапинг по уникальным полям
    #38297741
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user

id user_id1 91681112132 912123221115 9951113355

role

id role_idrole_name1 10admin2 20user15 30guest

user_role

user_id role_id9168111213 109168111213 209121232211 209951113355 30
...
Рейтинг: 0 / 0
Мапинг по уникальным полям
    #38297749
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да все верно - нельзя закладываться на авто созданные id - готорые генерит хибер.

а вот номера телефонов , как и номера ролей - они уникальны везде во всех схемах и базах.

Мапить нужно по ним.
...
Рейтинг: 0 / 0
Мапинг по уникальным полям
    #38297761
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user
id user_id1 91681112132 912123221115 9951113355

один ко многим : user - phone

phone

id phone_id user_id111 9168111213212 91212322111513 99511133551714 9951113355

в phone уникальный user.user_id - а не user.id

по user.user_id и мапимся.
...
Рейтинг: 0 / 0
Мапинг по уникальным полям
    #38297796
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Да все верно - нельзя закладываться на авто созданные id - готорые генерит хибер.
осталось узнать, как ты получишь ID при вставке нового объекта пользователем.
ВИ
- польз-ль нажал кнопку "Новый юзверь".
- дальше?
ЗЫ. Хибер САМ не генерирует ID
...
Рейтинг: 0 / 0
Мапинг по уникальным полям
    #38297842
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Atum1Да все верно - нельзя закладываться на авто созданные id - готорые генерит хибер.
осталось узнать, как ты получишь ID при вставке нового объекта пользователем.
ВИ
- польз-ль нажал кнопку "Новый юзверь".
- дальше?
ЗЫ. Хибер САМ не генерирует ID

мне приходят уже готовые данные из другой системы . моя система не создает новых юзеров .

так что мне придет :

запись user

9168111213 ; имя; фамилия; отчество;год рождения

все что я могу - это добавить ее в мои таблицы .
...
Рейтинг: 0 / 0
Мапинг по уникальным полям
    #38297972
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1мне приходят уже готовые данные из другой системы . моя система не создает новых юзеров .
тогда так:
- аннотация
Код: java
1.
<generator class="net.sf.hibernate.id.TableHiLoGenerator">


- реализация интерфейса
Код: java
1.
public class MyGenerator : IIdentifierGenerator


- второе Id2 поле выкинуть
- в первое хибер будет писать Id из другой системы
...
Рейтинг: 0 / 0
Мапинг по уникальным полям
    #38297978
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Он является автоинкрементным , что не подходит для мапинга при условии что с базой будут проводиться технические работы и репликации.
при этом просто выключают счётчики автоинкремента.
Не смешивай технические работы и рабочий режим.
...
Рейтинг: 0 / 0
Мапинг по уникальным полям
    #38298000
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и вариант2 - маппинг по Id с инкрементом. Эти счётчики абстрактные и ничем не мешают в работе.
Пользователям этот код не показывают.
Всё зависит что у тебя там за работы и реплики.
...
Рейтинг: 0 / 0
Мапинг по уникальным полям
    #38298312
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1сущность User : имеет уникальный праймари кей id - автоинкрементный для mysql.

Он является автоинкрементным , что не подходит для мапинга при условии что с базой будут проводиться технические работы и репликации.

Это утверждение является неверным логическим посылом.
И из него соответственно следует неверный вывод -- твоё желание сделать маппинг не по PK.

В книгах и руководствах по Хиберу ( я думаю я не очень сильно ошибусь, если распространю подход Хибера на весь современный JPA, ведь по сути он и был слизан с Хибера) в самом-самом начале есть глава, в которой написана самая главная заповедь Хиберниста:

Хибер ВеликийУ каждой таблицы есть PK, и PK идентифицирует в таблице запись.


Собственно, всё.
...
Рейтинг: 0 / 0
Мапинг по уникальным полям
    #38298313
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1а через уникальные поля user_id и role_id ?

Собственно, сделай в БД эти два поля первичными ключами, а те, другие -- просто UNIQUE.
...
Рейтинг: 0 / 0
Мапинг по уникальным полям
    #38298514
пролетевший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хибер ВеликийУ каждой таблицы есть PK, и PK идентифицирует в таблице запись.

У хибера есть еще одна заповедь, на которую меньше обращают внимания: не путать красное с соленым и разделять первичный ключ и бизнес ключ. Есть даже специальная аннотация @NaturalId для бизнес ключей. Это наверное лучше всего для описываемого случая: для внутренней работы использовать первичные/вторичные ключи,а для поиска значения из внешней системы.
А для отношений всегда можно указать, какие поля использовать для связывания: @JoinColumn и @OneToMany(mappedBy=...)+@Column
...
Рейтинг: 0 / 0
Мапинг по уникальным полям
    #38298573
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пролетевшийХибер ВеликийУ каждой таблицы есть PK, и PK идентифицирует в таблице запись.

У хибера есть еще одна заповедь, на которую меньше обращают внимания: не путать красное с соленым и разделять первичный ключ и бизнес ключ. Есть даже специальная аннотация @NaturalId для бизнес ключей. Это наверное лучше всего для описываемого случая: для внутренней работы использовать первичные/вторичные ключи,а для поиска значения из внешней системы.
А для отношений всегда можно указать, какие поля использовать для связывания: @JoinColumn и @OneToMany(mappedBy=...)+@Column


@NaturalId и @JoinColumn c указанием имен полей в обоих классах - должно сработать.

Просто @JoinColumn - когда я указывал имя колонки и имя реверсивной колонки - у меня почему то не сработало !

Да задача такая - я хочу оставить синтетический ключ и (PK) - id - он будет полезен.

но мапинг вести по другим полям.
...
Рейтинг: 0 / 0
Мапинг по уникальным полям
    #38298579
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivAtum1сущность User : имеет уникальный праймари кей id - автоинкрементный для mysql.

Он является автоинкрементным , что не подходит для мапинга при условии что с базой будут проводиться технические работы и репликации.

Это утверждение является неверным логическим посылом.
И из него соответственно следует неверный вывод -- твоё желание сделать маппинг не по PK.

В книгах и руководствах по Хиберу ( я думаю я не очень сильно ошибусь, если распространю подход Хибера на весь современный JPA, ведь по сути он и был слизан с Хибера) в самом-самом начале есть глава, в которой написана самая главная заповедь Хиберниста:

Хибер ВеликийУ каждой таблицы есть PK, и PK идентифицирует в таблице запись.


Собственно, всё.

Да такое правило есть и вся идея ORM базируется на этом краеугольном камне - pk - id

но в реальной жизни у вас могут быть разные системы и они должны общаться между собой ...

есть XA транзакции итд итп...

есть репликации - и одно дело когда репликация - полностью повторяет содержимое фактически побайтово ... и совсем другое когда она основана на вставках - insert ...


как вариант я рассматривал возможность описать класс user - c id - как PK уникальным но не автоинкрементным ..


тогда это поле и будет равно внешнему user_id из другой системы ... и при insert будет указан этот id

но может возникнуть ситуация, когда в системе появятся свои пользователи ...

и тогда мне потребуется своя последовательность для генерации UUID для пользователей.
...
Рейтинг: 0 / 0
Мапинг по уникальным полям
    #38298583
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нашел такой пример : по @NaturalId
http://www.concretepage.com/hibernate/naturalid_hibernate_annotation.php
...
Рейтинг: 0 / 0
Мапинг по уникальным полям
    #38299171
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Да такое правило есть и вся идея ORM базируется на этом краеугольном камне - pk - id
но в реальной жизни у вас могут быть разные системы и они должны общаться между собой ...

=== и что? Если ID системы А не равен ID системы Б, то это нормально. Т.к. это ОДИН из вариантов репликации.

есть XA транзакции итд итп...

==== ID просто технический номер в системе А.... У Петрова будет 01234 в А, а в Б будет 4567

есть репликации - и одно дело когда репликация - полностью повторяет содержимое фактически побайтово ... и совсем другое когда она основана на вставках - insert ...

===== побайтово - дамп из бэкапа = id совпадают. При МЕТОДЕ insert они будут разными. Всё остальное одинаковым.


итого NaturalId просто ставит уникальный индекс в БД для райзе. Ну, и несколько помогают в поиске объекта.
Хибер и БД всё равно будут работать по ID (скрестив пальцы за спиной))).
Вопросы репликации совместно с ID уже давно давно решены в форумах по СУБД. Не надо Хибер ставить сверху БД.
Если аэропорт AMS Амстердам в БД, то это не значит, что у них ID маппинга одинаков.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Мапинг по уникальным полям
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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