Насколько интеллектуален Hibernate для преобразования кортежей JDBC в объекты Java - PullRequest
0 голосов
/ 28 февраля 2019

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

@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) ??

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

Спасибо ...

ПРИМЕЧАНИЕ: Я предполагаю, что Hibernate преобразует данные BLOB-объекта в byte[]используя JDBC Resultset.getBinaryStream(int) и что база данных (оракул) возвращает LOB_LOCATOR в таком столбце ...

1 Ответ

0 голосов
/ 28 февраля 2019

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...