Hibernate-search: Поля базового класса не регистрируются в elasti c -search путем программной регистрации полей в hibernate-search - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть определенные поля, объявленные в базовом классе, и я хочу зарегистрировать эти поля только для определенных подклассов (сущностей).

Так что я не хочу аннотировать эти поля в базовом классе с помощью @Field и хотя достаточно просто программной регистрации для определенных объектов.

Но поля, объявленные в базовом объекте, не зарегистрированы / не сопоставлены с elasti c -search, и если попытаться выполнить поиск, он выдаст исключение ниже.

Я также пытался переместить это поле в сущности, а не объявлять его в базовом классе, и регистрация этих полей программно работает для меня, поэтому, только если поля в базовом классе не работают.

Вот мой пример кода

public class BaseEntity{

@Column(name = "created_timestamp")
private String createdTimeStamp;

@Column(name = "created_by")
private ZonedDateTime createdBy;

//getter and setter

}
@Entity
@Indexed    
public class BookEntity extends BaseEntity{

//other fields
}
@Entity
@Indexed
public class PaperBookEntity extends BaseEntity{

//other fields
}
public class HibernateSearchFieldMappingService{

@Autowired
private SearchMapping searchMapping;

 @Override
  public <T extends BaseEntity> void registerAuditFields(Class<T> entityClass) {
    LOG.info("Registering audit fields (createdTimeStamp and createdBy) of entity {}", entityClass);
    IndexedMapping indexedMapping = searchMapping.entity(entityClass).indexed();
    FieldMapping fieldMapping = indexedMapping.property("createdTimeStamp", ElementType.FIELD).field();
    fieldMapping.dateBridge(Resolution.SECOND);
    fieldMapping.sortableField();
    indexedMapping.entity(entityClass).indexed().property("createdBy", ElementType.FIELD).field().normalizer("lowercase");
  }

  }

Вот мой след стека

org.hibernate.search.exception.SearchException: Unable to find field createdBy in com.*.*.*.BookEntity
    at org.hibernate.search.engine.spi.DocumentBuilderIndexedEntity.objectToString(DocumentBuilderIndexedEntity.java:1052)
    at org.hibernate.search.query.dsl.impl.FieldContext.objectToString(FieldContext.java:75)
    at org.hibernate.search.query.dsl.impl.ConnectedMultiFieldsTermQueryBuilder.buildSearchTerm(ConnectedMultiFieldsTermQueryBuilder.java:149)
    at org.hibernate.search.query.dsl.impl.ConnectedMultiFieldsTermQueryBuilder.createQuery(ConnectedMultiFieldsTermQueryBuilder.java:113)
    at org.hibernate.search.query.dsl.impl.ConnectedMultiFieldsTermQueryBuilder.createQuery(ConnectedMultiFieldsTermQueryBuilder.java:72)

Версии Hibernate, которые я использую,

hibernate-search -asticsearch, hibernate-search-orm = 5.11.4. Финал

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Программный c API в Hibernate Search 5 не распознает «унаследованные» свойства, а только свойства, объявленные непосредственно для отображаемого вами типа. См. HSEARCH-1108 .

Проблема была решена в Hibernate Search 6, поэтому ее можно решить путем обновления. Имейте в виду, что Hibernate Search 6 находится в бета-версии и API-интерфейсы совершенно разные. См. здесь для руководства по началу работы.

Чтобы эта работа работала в Hibernate Search 5 без обновления до 6, обычным решением является не использование API Programmati c, а переопределение геттеры в классах, где вы хотите, чтобы поля появлялись, и аннотируйте переопределенные геттеры.

Например:

@MappedSuperclass
public class BaseEntity{

@Column(name = "created_by")
private String createdBy;

@Column(name = "created_timestamp")
private ZonedDateTime createdTimeStamp;

public String getCreatedBy() {
    return createdBy;
}

public String getCreatedTimeStamp() {
    return createdTimeStamp;
}
}
@Entity
@Indexed    
public class BookEntity extends BaseEntity{

@Override
@Field(normalizer = @Normalizer(definition = "lowercase"))
public String getCreatedBy() {
    return super.getCreatedBy();
}

@Override
@Field
@SortableField
public String getCreatedTimeStamp() {
    return createdTimeStamp;
}
}
0 голосов
/ 11 февраля 2020
@Column(name = "created_timestamp")
private String createdBy;

@Column(name = "created_by")
private ZonedDateTime createdTimeStamp;

Не должно ли это быть

@Column(name = "created_timestamp")
private String createdTimeStamp;;

@Column(name = "created_by")
private ZonedDateTime createdBy

Другое предположение ** Имя столбца create_by вместо создалBy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...