循环JPA数组而不触发Lob获取

时间:2017-11-02 15:54:28

标签: spring postgresql hibernate jpa kotlin

如果定义了以下Spring JPA实体:

@Entity
class Album(
        @Id
        val id: Long = 0,
        ...
        @OneToMany(mappedBy = "album")
        val mediaItems: Set<Media>) : Serializable

@Entity
@Table(name = "media")
class Media(
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(columnDefinition = "serial")
        var id: Long? = null,
        @Column
        @Lob
        var content: ByteArray

该定义包括一个延迟获取的@Lob列,由于底层数据库使用Postgres大对象,因此实际上是懒惰的。我的春天jpa是由冬眠支持的。循环遍历mediaItems spring jpa条目时,所有条目都会自动获取其关联的@Lob内容,甚至不会触及内容列。当前序列化不需要此Lob输出,并且极大地减慢了循环速度。这是我的循环:

val albumProtocs = MediaProtocs.AlbumList.newBuilder().addAllAlbum(
                ownAlbum.map { album ->

                    MediaProtocs.Album.newBuilder()
                            .setId(album.id)
                            .setName(album.name)
                            .addAllMedia(album.mediaItems.map { media ->
                                MediaProtocs.Media.newBuilder().setId(media.id as Long)
                                        .setDescription(media.description)
                                        .setMimeType(media.mimetype).build()
                            }).build()
                }).build() 

1 个答案:

答案 0 :(得分:1)

如果你调用实体对象的任何方法,除了getter之外,Hibernate会加载所有惰性字段。你只需要找到被调用的方法。

您可以尝试在没有相册的情况下直接加载媒体列表。您也可以尝试使用投影将媒体列表加载到DTO列表。