Предположим, что эта модель,
@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 в таком столбце...




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, в частности, хотя и заслуживают доверия, вероятно, неуместны. Это то, что вы должны контрольная работа, как и все остальное, но я думаю, вы обнаружите, что данные больших объектов передаются из базы данных только по запросу и что они будут запрашиваться только один раз для каждого поля для каждого отдельного объекта.