Hibernate Search 6:方法映射

Hibernate Search 6: Methods mapping

在 Hibernate 搜索中 5.x 我可以像这样将实体方法映射为全文字段:

@Entity
public class Person {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    private String surname;

    public String getWholeName() {
        return name + " " + surname;
    }

    // getters, setters
}

// Mapping configuration, programmatic approach
SearchMapping sm = new SearchMapping();
sm
  .entity(Person.class)
  .indexed()
  .property("wholeName", ElementType.METHOD)
  .field();

然后我的全文索引中有一个名为“wholeName”的字段,它包含 return getWholeName() 方法的值。

如何在 Hibernate Search 6 中实现?我只找到了一种映射实体字段的方法,但没有找到方法。谢谢!

简答

如果没有名为 wholeName 的字段,Hibernate Search 6 将自动回退到 getter。 Hibernate Search 5 中的 ElementType 不再是必需的,这就是它被删除的原因。

请注意,Hibernate Search 在检测实体更改方面也更加智能。这通常很好,但缺点是您需要告诉 Hibernate Search wholeName 依赖的其他属性。参见 this section of the documentation (you can also find an example using the programmatic mapping API here)。

长答案

当属性有一个字段但没有getter,或一个getter但没有字段,没有歧义。 Hibernate Search 使用唯一可用的访问类型。

当一个属性同时具有字段和getter时,需要做出选择。 Hibernate Search 6 选择遵守 Hibernate ORM 的访问类型。

Hibernate ORM 通过直接访问字段(“字段”访问类型)或通过 getters/setters(“属性”访问类型)访问属性。

默认情况下,Hibernate ORM 中的访问类型由 @Id 注释所在的位置决定。在这种情况下,@Id 注释位于字段上,而不是方法上,因此 Hibernate ORM 将使用“字段”访问类型。 Hibernate Search 也将如此。

您还可以使用 @Access 注释显式设置 Hibernate ORM 访问类型,无论是针对整个实体(将注释放在 class 上)还是针对特定 属性 (将注释放在字段上)。 Hibernate Search 也将遵守此规定。