Как решить проблему N+1 для объекта с несколькими коллекциями в отношениях OneToMany в Spring JPAJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как решить проблему N+1 для объекта с несколькими коллекциями в отношениях OneToMany в Spring JPA

Сообщение Anonymous »

В моем приложении Spring JPA у меня есть следующий объект и репозиторий (упрощенный для этого примера):

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

@Entity
class User {
@Id
val id: UUID

@OneToOne
val info: UserInfo

@OneToMany
val documents: List

@OneToMany
val posts: List
}

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

interface UserRepository : JpaRepository {

@Query("custom query defined here")
fun findAllWithCustomQuery(): List

}
После вызова метода findAllWithCustomQuery я столкнулся с проблемой N+1. Поэтому я попытался создать EntityGraph для решения этой проблемы. Сначала я попытался создать его только для отношения UserInfo, и оно сработало нормально (дополнительный запрос для получения UserInfo не выполнялся).

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

@Entity
@NamedEntityGraph(
name = "graph.User", // I referenced this name in the repository method
attributeNodes = [
NamedAttributeNode("userInfo")
]
)
class User {
@Id
val id: UUID

@OneToOne
val info: UserInfo

@OneToMany
val documents: List

@OneToMany
val posts: List
}
Но затем я попытался применить тот же подход к документам и сообщениям

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

@Entity
@NamedEntityGraph(
name = "graph.User", // I referenced this name in the repository method
attributeNodes = [
NamedAttributeNode("userInfo"),
NamedAttributeNode("documents"),
NamedAttributeNode("posts")
]
)
class User {
@Id
val id: UUID

@OneToOne
val info: UserInfo

@OneToMany(fetch = FetchType.EAGER)
val documents: List

@OneToMany(fetch = FetchType.EAGER)
val posts: List
}
И выдало исключение с ошибкой: невозможно одновременно загрузить несколько сумок. Я искал в Интернете, и одно из решений предложило использовать Set вместо List. Я не уверен, что это было бы идеально, поскольку это привело бы к созданию декартова произведения, а в моем реальном примере у меня есть пять связей @OneToMany, что может привести к еще большим проблемам с производительностью. Кроме того, я не могу найти или придумать другое решение этой проблемы, поскольку оно кажется невозможным с точки зрения запроса.
Есть ли способ получить всю необходимую мне информацию (несколько пользователей) и связанные с ними документы и сообщения) в одном запросе? Если нет, то есть ли способ предсказать, действительно ли декартово произведение будет проблемой или нет?

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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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