Насколько умно Hibernate преобразует кортежи JDBC в объекты Java

Предположим, что эта модель,

@Entity
@Table(name = "play_list")
public class PlayList {
    @Id @Column(name = "code")
    private Long code;
    ...
    @ManyToMany(fetch = LAZY)
    @JoinTable(...)
    private List<Song> songs = new ArrayList<>();
}

@Entity
@Table(name = "song")
public class Song {
    @Id @Column(name = "code")
    private Long code;

    @Lob @Column(name = "raw_data")
    private byte[] rawData; // The binary value of the song (important!)
    ...
    @ManyToMany(mappedBy = "songs")
    private List<PlayList> playLists = new ArrayList<>();
}

Затем, если вы выполните запрос JPA, подобный этому:

SELECT pl, s
FROM
    playlist pl
      INNER JOIN pl.songs s

Hibernate выполняет следующий SQL-запрос:

SELECT pl.*, s.*
FROM
    play_list pl
      INNER JOIN play_list_song pls ON pl.code = pls.playlist_code
      INNER JOIN song s ON pls.song_code = s.code

Я отлаживал этот код, и Hibernate правильно связывает кортежи JDBC... позвольте мне объяснить на примере, если у вас есть 2 песни и 2 списка воспроизведения, и оба списка воспроизведения содержат 2 песни, спящий режим отображает только 4 объекта Java...

Но и это мой вопрос, чтобы создать эти 4 java-объекта, Hibernate анализирует и загружает каждый кортеж JDBC в память, чтобы позже отбросить дублированные объекты (объекты одной сущности и одного @Id)??

Почему я это спрашиваю? Что ж, предположим, что вы выполняете предыдущий запрос и у вас есть много плейлистов с общими песнями... если спящий режим загружает все перед отбрасыванием повторяющихся объектов, то он будет считывать byte[] rawData много раз (что может быть проблемой, если rawData представлены в виде величины МБ)

Спасибо ...

ЗАМЕТКА: Я предполагаю, что Hibernate преобразует данные большого двоичного объекта в byte[] с помощью JDBC Resultset.getBinaryStream(int) и что база данных (оракул) возвращает LOB_LOCATOR в таком столбце...

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
283
1

Ответы 1

does Hibernate parse and load each JDBC tuple into memory, to later discard duplicated objects (objects of the same entity and same @Id)??

Вы уже отследили запрос, который выполняет Hibernate. Он должен обработать результаты этого запроса, которые в вашем примере содержат повторяющиеся данные списка воспроизведения и повторяющиеся данные песни. Ему нужна информация из каждой строки результирующего набора, но не из каждого столбца каждой строки.

Возможно ли выбрать необходимые данные из набора результатов, вероятно, больше зависит от базы данных и драйвера JDBC, чем от чего-либо еще. Если вас беспокоит масштабируемость, вам следует ошибиться в сторону пессимизма, предполагая, что все столбцы всех строк будут перенесены из базы данных в Java.

С другой стороны, ваши опасения по поводу данных LOB, в частности, хотя и заслуживают доверия, вероятно, неуместны. Это то, что вы должны контрольная работа, как и все остальное, но я думаю, вы обнаружите, что данные больших объектов передаются из базы данных только по запросу и что они будут запрашиваться только один раз для каждого поля для каждого отдельного объекта.

Другие вопросы по теме