In Hibernate Search 5.x I can map entity method as the fulltext field like this:
@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();
Then I have a field with name “wholeName” in my fulltext index and it contains return value of getWholeName()
method.
How to do it in Hibernate Search 6? I found only a way how to map an entity field but not a method. Thank you!
Advertisement
Answer
Short answer
If there is no field named wholeName
, Hibernate Search 6 will automatically fall back to the getter. The ElementType
from Hibernate Search 5 is no longer necessary, and that’s why it was removed.
Note that Hibernate Search is also smarter when it comes to detecting changes in entities. That’s usually great, but the downside is that you’ll need to tell Hibernate Search what other attributes wholeName
relies on. See this section of the documentation (you can also find an example using the programmatic mapping API here).
Long answer
When an attribute has a field but no getter, or a getter but no field, there is no ambiguity. Hibernate Search uses the only available access type.
When an attribute has both a field and a getter, there is a choice to be made. Hibernate Search 6 chooses to comply with Hibernate ORM’s access type.
Hibernate ORM accesses attributes either by direct access to the field (“field” access type) or through getters/setters (“property” access type).
By default, the access type in Hibernate ORM is determined by where your @Id
annotation is. In this case, the @Id
annotation is located on a field, not a method, so Hibernate ORM will use the “field” access type. And so will Hibernate Search.
You can also set the Hibernate ORM access type explicitly using the @Access
annotation, either for the whole entity (put the annotation on the class) or for a particular property (put the annotation on the field). Hibernate Search will comply with this too.