将访问用@LazyCollection(LazyCollectionOption.EXTRA)注释的列表中的元素会导致初始化整个列表吗?

问题描述 投票:1回答:1

我有以下聊天课:

@Data
@Entity
@NoArgsConstructor
public class Chat extends BaseEntity {

    @ManyToOne
    @JoinColumn(name = "user1_id")
    private User user1;

    @ManyToOne
    @JoinColumn(name = "user2_id")
    private User user2;

    @LazyCollection(LazyCollectionOption.EXTRA)
    @OrderBy("sentAt DESC")
    @OneToMany(mappedBy = "chat", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<Message> messages = new ArrayList<>();

    public Chat(User user1, User user2) {
        this.user1 = user1;
        this.user2 = user2;
    }
}

关于messages字段,我只想访问第一个元素,-这是本例的最新消息-

是否执行以下语句:chat.getMessages().get(0)使整个messages列表初始化?如果是,那么最佳实践是什么?

java hibernate spring-boot jpa
1个回答
1
投票

无法以这种方式工作。

根据休眠documentation

[LazyCollectionOption.EXTRA仅适用于有序集合,用@OrderColumn注释的列表或映射。

对于袋(例如,不保留任何特定顺序的实体的常规列表),@LazyCollection(LazyCollectionOption.EXTRA)的行为类似于任何其他FetchType.LAZY集合(该集合在首次访问时就被完全提取)。] >

从另一面看,根据@OrderColumn注释的文档:

OrderBy批注应用于进行排序,这些排序应显示为持久状态并由应用程序维护。 OrderBy注释在指定OrderColumn时不使用。

顺序列必须是整数类型。

在更新关联或元素集合时,持久性提供程序将保持顺序列值的连续(非稀疏)顺序。第一个元素的订单列值为0。

因此,您不能使用@OrderColumn注释按日期/时间进行排序,因此不能将LazyCollectionOption.EXTRA用于第一个元素的延迟加载。

我建议您使用单独的查询来获取最后一个聊天消息。

© www.soinside.com 2019 - 2024. All rights reserved.