Hibernate 6. Отношения OneToOne EAGER и проблема N+1JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Hibernate 6. Отношения OneToOne EAGER и проблема N+1

Сообщение Anonymous »

У меня есть простой пример с отношением oneToOne.
Схема базы данных

Код: Выделить всё

create table if not exists Room
(
id   int primary key generated always as identity,
name text not null
);
create table if not exists RoomInfo
(
id        int primary key generated always as identity,
room_id   int references Room (id),
info_name text
);
Схема гибернации

Код: Выделить всё

@Entity
@Table(name = "room")
class Room(
@Column(name = "name")
val name: String,
) {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
val id: Int = 0

@OneToOne(cascade = [CascadeType.ALL], fetch = FetchType.EAGER, optional = true, mappedBy = "room")
var roomInfo: RoomInfo? = null
}

@Entity
@Table(name = "roominfo")
class RoomInfo(
@Column(name = "info_name")
val infoName: String,
@OneToOne
@JoinColumn(name = "room_id")
val room: Room
) {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
val id: Int = 0
}
Когда я пытаюсь найти комнату по идентификатору (простой метод findById из JpaRepository), я вижу хороший запрос на левое соединение

Код: Выделить всё

Hibernate: select r1_0.id,r1_0.name,ri1_0.id,ri1_0.info_name from room r1_0 left join roominfo ri1_0 on r1_0.id=ri1_0.room_id where r1_0.id=?
Но когда я пытаюсь использовать JpaRepository findAll(), я сталкиваюсь с проблемой N+1

Код: Выделить всё

Hibernate: select r1_0.id,r1_0.name from room r1_0
Hibernate: select ri1_0.id,ri1_0.info_name,r1_0.id,r1_0.name from roominfo ri1_0 left join room r1_0 on r1_0.id=ri1_0.room_id where ri1_0.room_id=?
Hibernate: select ri1_0.id,ri1_0.info_name,r1_0.id,r1_0.name from roominfo ri1_0 left join room r1_0 on r1_0.id=ri1_0.room_id where ri1_0.room_id=?
Попробуйте добавить @Fetch(JOIN), но это не исправлено.
Как я могу сказать, что Hibernate использует oneToOne в качестве левого соединения во всех операциях?

Подробнее здесь: https://stackoverflow.com/questions/790 ... n1-problem
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Использование FetchMode.SELECT с FetchType.EAGER в Hibernate
    Гость » » в форуме JAVA
    0 Ответы
    32 Просмотры
    Последнее сообщение Гость
  • Почему отношения «OneToOne» позволяют хранить более одного данных в базе данных
    Anonymous » » в форуме JAVA
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Hibernate OneToOne с дочерним объектом CascadeType.ALL не может быть создан одновременно с родительским объектом.
    Anonymous » » в форуме JAVA
    0 Ответы
    62 Просмотры
    Последнее сообщение Anonymous
  • «Мягкое удаление» в Hibernate с сопоставлением OneToOne
    Anonymous » » в форуме JAVA
    0 Ответы
    25 Просмотры
    Последнее сообщение Anonymous
  • Ассоциация Hibernate OneToOne, владеющая сторона не сохраняет внешний ключ
    Anonymous » » в форуме JAVA
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»