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