休眠中的 FieldType.nested 是什么

whats is FieldType.nested in hibernate

我试图理解以下代码。

```

class Member {

   @Id
   private Long id;

   @OneToOne(optional = false,
            cascade = {CascadeType.MERGE, CascadeType.REFRESH, CascadeType.REMOVE})
    @MapsId
    @Field(type = FieldType.Nested)
    private Reference reference;
}

```

基本上我开始分析这个 class 因为我们有 n+1 个关于会员的问题。它起源于 @ManyToOne 关系,所以我在 Member 之上添加了 @Batchsize 并部分解决了我的问题。它部分解决了,因为另一个 @OneToOne 关系仍在触发 n 查询。我想将这种关系转换为 Lazy 并用 BatchSize 进行注释,但考虑到以上两个注释 - MapsId@Field(type = FieldType.Nested)

,我无法理解它的影响

谁能帮我理解这些注释以及如果我建立这种关系可能产生的影响Lazy

我会尝试解释所有这三个

1. FetchType Lazy 和 Eager

  • 如果获取类型是 Eager。当您调用 "Select * from Member" 时,您会看到休眠 "Select r from Reference where id = ?"

  • 触发了另一个查询
  • 如果获取类型是惰性的,则在您执行类似操作之前不会触发第二个查询

    Member m = getMember(id);
    
    m.getReference(); // Hibernate will fire another query. 
    
  • 大多数情况下我使用 LAZY

2。 @Batchsize

  • 在 get 调用 BatchSize 的情况下表现如下 例如:
  • 假设您已经获取了 25 个 Member 实例,并且每个 Member 都有对 Reference 的引用。参考 class 与 lazy="true".

  • 映射
  • 如果您遍历 mem.getReference(),默认情况下,Hibernate 将执行 25 SELECT 条语句来检索代理引用。

  • 您可以通过在 Reference 的映射中指定批量大小来调整此行为,假设为 batchSize 10
  • Hibernate 现在将只执行三个查询:模式是 10, 10, 5.

3。 FieldType.Nested

  • 当您需要索引对象数组并保持每个对象的独立性时,应使用此数据类型。

  • 这意味着所有对象的值不会像您在上面看到的那样混合在一起。

  • 在内部,数组中的每个对象都作为单独的隐藏文档进行索引。

    更多详情here