1

在 Hibernate Search 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”的字段,它包含getWholeName()方法的返回值。

如何在 Hibernate Search 6 中做到这一点?我只找到了一种如何映射实体字段的方法,而不是一种方法。谢谢!

4

1 回答 1

1

简短的回答

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

请注意,在检测实体更改时,Hibernate Search 也更智能。这通常很好,但缺点是您需要告诉 Hibernate Search 其他属性wholeName依赖于什么。请参阅文档的这一部分(您还可以在此处找到使用编程映射 API 的示例)。

长答案

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

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

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

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

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

于 2021-05-19T11:37:48.910 回答