powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate запросы
25 сообщений из 41, страница 1 из 2
Hibernate запросы
    #39228947
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть двухсторонний мапинг:
Код: java
1.
2.
3.
4.
5.
6.
7.
@Entity
@Table(name = "client")
@Data
public class Client {
....
@OneToOne(mappedBy = "client", fetch = FetchType.LAZY, optional = false)
private Passport passport;


и:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
@Entity
@Table(name = "passport")
@Data
public class Passport {
...
@JsonIgnore
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "client_id", nullable = false, unique = true)
private Client client;


В результате при вызове:
1.
Код: java
1.
Client client = clientRepository.findOne(id);


получаю 2 запроса:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Hibernate: 
    select
        client0_.id as id1_0_0_,
        client0_.first_name as first_na2_0_0_,
        client0_.last_name as last_nam3_0_0_ 
    from
        client client0_ 
    where
        client0_.id=?
Hibernate: 
    select
        passport0_.id as id1_2_0_,
        passport0_.client_id as client_i3_2_0_,
        passport0_.number as number2_2_0_ 
    from
        passport passport0_ 
    where
        passport0_.client_id=?


Почему 2 понятно, потому что fk находится в таблице passport, т.е. хибернейту для построения прокси необходимо сделать запрос в passport и удостовериться есть ли там запись для текущего клиента.
С другой стороны, если сделать:
2.
Код: java
1.
Passport passport = passportRepository.findOne(id);


идет один запрос, а если добавляю:
Код: java
1.
2.
        Client client = passport.getClient();
        logger.info("client id = " + client.getId());


Летит 3 запроса, что как бы тоже понятно почему(1+2 случай).
Как оптимизировать, чтобы уменьшить количество запросов?
@PrimaryKeyJoinColumn для случая 1. не подходит, т.к. pk у passport и client могут не совпадать
Спасибо
...
Рейтинг: 0 / 0
Hibernate запросы
    #39228995
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,
1 чем тебя пугают лишние запросы?
2 откажись от хибера - будет все под твоим контролем, а не под контролем прокладки
...
Рейтинг: 0 / 0
Hibernate запросы
    #39229011
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTКак оптимизировать, чтобы уменьшить количество запросов?
- проектировать по методологии.
- сначала значимые для бизнеса сущности.
Т.е. связь один к одному не рекомендуется.
Если паспорт один, то его в таблу клинета. Если много и он ВАЖЕН для бизнеса, то делать отдельно и связь будет один ко многим.
...
Рейтинг: 0 / 0
Hibernate запросы
    #39229016
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123JulTКак оптимизировать, чтобы уменьшить количество запросов?
- проектировать по методологии.
- сначала значимые для бизнеса сущности.
Т.е. связь один к одному не рекомендуется.
Если паспорт один, то его в таблу клинета. Если много и он ВАЖЕН для бизнеса, то делать отдельно и связь будет один ко многим.
- проектировать по методологии - это как?
паспорт один, в этом случае не понятно где лучше хранить fk, в таблице client(passport_id) или в таблице passport(client_id)
...
Рейтинг: 0 / 0
Hibernate запросы
    #39229019
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяJulT,
1 чем тебя пугают лишние запросы?
2 откажись от хибера - будет все под твоим контролем, а не под контролем прокладки
1. ну производительность и все такое
2. радикально
...
Рейтинг: 0 / 0
Hibernate запросы
    #39229020
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTпаспорт один, в этом случае не понятно где лучше хранить fk, в таблице client(passport_id) или в таблице passport(client_id)
вы таблички в БД своего маппинга видите? Если да, то приведите тут реальную схему БД.
Если сущность клиент одна, то все реквизиты паспорта переходят в класс Person как обычные поля
- возраст
- пол
- код документа (FK на типы удостоверения)
- номер\серия документа
- ...
...
Рейтинг: 0 / 0
Hibernate запросы
    #39229024
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTвадяJulT,
1 чем тебя пугают лишние запросы?
2 откажись от хибера - будет все под твоим контролем, а не под контролем прокладки
1. ну производительность и все такое
2. радикально
вот для производительности и см. п. 2
хибер сам по себе дополнительный код, выполнение которого дополнительный тормоз.
...
Рейтинг: 0 / 0
Hibernate запросы
    #39229025
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,
если не заходтите как выше, то пробуйте:
Для Person
- аннотации:
@NotNull
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn (name = "passportId", referencedColumnName = "id")
private passport passport;
------------------------------


Для passport
- аннотации:
@NotNull
@OneToOne (cascade= CascadeType.ALL)
@JoinColumn (name = "personId", referencedColumnName = "id")
private Person person;
...
Рейтинг: 0 / 0
Hibernate запросы
    #39229027
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
убрать хибер тут вроде не рассматриваем(
...
Рейтинг: 0 / 0
Hibernate запросы
    #39229036
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
к сожалению....
имея опыт работы с базами, я с жалостью смотрю посты про хибер.
отказавшись от него всё решается намного проще и быстрее.
...
Рейтинг: 0 / 0
Hibernate запросы
    #39229059
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяимея опыт работы с базами
уже говорил.
Опыт работы по Java направлениям тоже интересен. Поверь и не флуди.
...
Рейтинг: 0 / 0
Hibernate запросы
    #39229072
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,
итого 3 вар-та по приоритетам:
- 1 сущность и 1 табличка в БД (1 класс)
- 2 сущности и 1 табличка в БД (2 класса + Embedded)
- 2 сущности и 2 табличка в БД (2 класса + One to One)
Зависит от бизнеса, но чем выше тем проще БД.
Удачи!
...
Рейтинг: 0 / 0
Hibernate запросы
    #39229118
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123JulT,
итого 3 вар-та по приоритетам:
- 1 сущность и 1 табличка в БД (1 класс)
- 2 сущности и 1 табличка в БД (2 класса + Embedded)
- 2 сущности и 2 табличка в БД (2 класса + One to One)
Зависит от бизнеса, но чем выше тем проще БД.
Удачи!
Спасибо!
А подскажите еще такой момент:
Код: java
1.
2.
3.
public class Client
@OneToOne(mappedBy = "client", fetch = FetchType.LAZY, optional = false, cascade = CascadeType.ALL)
private Passport passport;


стоит cascade = CascadeType.ALL, т.е. при удалении клиента хочу чтобы удалялся passport
все прекрасно работает когда в public class Passport стоит:
Код: java
1.
2.
3.
@OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "client_id", unique = true)
    private Client client;


но как только добавила @JoinColumn(name = "client_id", nullable = false, unique = true), выскакивает ошибка при удалении: clientRepository.delete(15L); - Column 'client_id' cannot be null
снимать ограничение не хочется, как в таком случае поступают?
...
Рейтинг: 0 / 0
Hibernate запросы
    #39229128
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,
вообще то, я просил схему БД-табличек. Непонятно что вы решили.
В конечном итоге - БД главная. А хибер, маппинг и Java - обслуга.
...
Рейтинг: 0 / 0
Hibernate запросы
    #39229135
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123JulT,
вообще то, я просил схему БД-табличек. Непонятно что вы решили.
В конечном итоге - БД главная. А хибер, маппинг и Java - обслуга.
...
Рейтинг: 0 / 0
Hibernate запросы
    #39229136
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри, еще один
...
Рейтинг: 0 / 0
Hibernate запросы
    #39229153
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,
вы оптимизируете запросы к БД.
- какой смысл номер паспорта держать в отдельной, если паспорт у вас всегда один?
- даже если нужен класс для Java паспорта, то есть embedded (табличка будет одна)
- код клиента не совпадает с кодом паспорта, хотя отношение одно к одному. Будут до запросы из за этой неразберихи.
...
Рейтинг: 0 / 0
Hibernate запросы
    #39229155
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,
passport.number перенести в client.passport_number
?
...
Рейтинг: 0 / 0
Hibernate запросы
    #39229166
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123JulT,
passport.number перенести в client.passport_number
?
перенести можно, это же игрушечный пример, мне просто хочется разные варианты попробовать
про эмбедед знаю. а если в будущем паспорт будет не один? вот именно из таких соображений я решила отдельную табличку сделать.
"код клиента не совпадает с кодом паспорта" - вы имеете ввиду client id не совпадает с passport id? а почему он должен совпадать?
если потребуют заводить клиента без паспорта, с возможностью добавить паспортные данные позже, то будет ситуация когда они будут разными
...
Рейтинг: 0 / 0
Hibernate запросы
    #39229179
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,
не пишите на будущее - всё равно переписывать)). (с)
- если на будущее, то паспортов много на одного клиента. Отношение Один ко Многим или Много к одному. Со всем вытекающими и маппингом.
Ещё заведите таблу на Смену Фамилии на будущее и Смену пола.
ЗЫ
Если не поняли, то маппинг Один к Одному в БД не приветствуется.
Ограничивать хотелки и Модель ваша прямая обязанность.
...
Рейтинг: 0 / 0
Hibernate запросы
    #39229207
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123JulT,
не пишите на будущее - всё равно переписывать)). (с)
- если на будущее, то паспортов много на одного клиента. Отношение Один ко Многим или Много к одному. Со всем вытекающими и маппингом.
Ещё заведите таблу на Смену Фамилии на будущее и Смену пола.
ЗЫ
Если не поняли, то маппинг Один к Одному в БД не приветствуется.
Ограничивать хотелки и Модель ваша прямая обязанность.
Поняла, спасибо) Но все же, если связь один к одному, а полей не 1 как в passport, а 100, например, не хранить же мне все эти 100 полей в client, это уже не таблица, а гармонь какая-то))
...
Рейтинг: 0 / 0
Hibernate запросы
    #39229212
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,
мне пофлудить или и так преимущества прокладки видны :)
...
Рейтинг: 0 / 0
Hibernate запросы
    #39229215
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяJulT,
мне пофлудить или и так преимущества прокладки видны :)
а что вы предлагаете? jdbcTemplate?
...
Рейтинг: 0 / 0
Hibernate запросы
    #39229219
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTесли связь один к одному, а полей не 1 как в passport, а 100, например, не хранить же мне все эти 100 полей в client, это уже не таблица, а гармонь какая-то))
ваш вопрос задают через раз в ветке Оракле - хоть 500 полей будет нормально.
С точки зрения загрузки побайтовой, то это пшик. Т.к. поля простого типа.
Исходите из бизнеса, но зазря сущностей не плодите.
Замучитесь на JOIN.
ЗЫ.
Для пробы я написал выше 3 варианта.
1 и 2 нет никаких JOIN и сущности грузятся автоматически.
п.п.3 я не очень понимаю ценности.
п.п.4 полноценная сущность со своим Id и FK. Отработана годами.
IMHO
...
Рейтинг: 0 / 0
Hibernate запросы
    #39229221
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадямне пофлудить или и так преимущества прокладки видн
прокладка причём, если маппинг неверен?
Хибер сам БД не анализирует.
...
Рейтинг: 0 / 0
25 сообщений из 41, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate запросы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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