Поиск в спящем режиме: IllegalArgumentException при индексации дочернего класса @Field с использованием @IndexedEmbedded - PullRequest
0 голосов
/ 08 ноября 2018

Я обнаружил IllegalArgumentException при индексации новой записи на этапе фиксации моей транзакции Hibernate.

У меня есть следующая конфигурация:

@Indexed(index = "quotation")
@Entity
@Table(name = "quotation")
public class QuotationEntity {

    @IndexedEmbedded
    @OneToMany(mappedBy = "quotation", fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST, CascadeType.MERGE }, orphanRemoval = true)
    private Set<QuotationLineEntity> quotationLines = new HashSet<>();
}

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "quotation_line")
public abstract class QuotationLineEntity {
}

@Indexed(index = "quotation_article")
@Entity
@Table(name = "quotation_article")
public class QuotationArcticleEntity extends QuotationLineEntity {

    @Field
    @Column(name = "designation")
    private String designation;
}

@Entity
@Table(name = "quotation_item")
public class QuotationItemEntity extends QuotationLineEntity {
}

Давайте представим, что я создал следующий объект: цитата из 2 строк цитаты:

  • QuotationArticleEntity (обозначение = "тест")
  • QuotationItemEntity (поле обозначения отсутствует)

При индексации я получаю следующий стек:

Caused by: java.lang.IllegalStateException: Could not get property value
    at org.hibernate.search.util.impl.ReflectionHelper.getMemberValue(ReflectionHelper.java:93)
    at org.hibernate.search.engine.spi.DocumentBuilderIndexedEntity.buildDocumentFieldsForProperties(DocumentBuilderIndexedEntity.java:563)
    at org.hibernate.search.engine.spi.DocumentBuilderIndexedEntity.buildDocumentFields(DocumentBuilderIndexedEntity.java:413)
    at org.hibernate.search.engine.spi.DocumentBuilderIndexedEntity.buildDocumentFieldsForEmbeddedObjects(DocumentBuilderIndexedEntity.java:485)
    at org.hibernate.search.engine.spi.DocumentBuilderIndexedEntity.buildDocumentFields(DocumentBuilderIndexedEntity.java:429)
    at org.hibernate.search.engine.spi.DocumentBuilderIndexedEntity.getDocument(DocumentBuilderIndexedEntity.java:351)
    at org.hibernate.search.engine.spi.DocumentBuilderIndexedEntity.createAddWork(DocumentBuilderIndexedEntity.java:253)
    at org.hibernate.search.engine.spi.DocumentBuilderIndexedEntity.addWorkToQueue(DocumentBuilderIndexedEntity.java:195)
    at org.hibernate.search.engine.impl.WorkPlan$PerEntityWork.enqueueLuceneWork(WorkPlan.java:521)
    at org.hibernate.search.engine.impl.WorkPlan$PerClassWork.enqueueLuceneWork(WorkPlan.java:283)
    at org.hibernate.search.engine.impl.WorkPlan.getPlannedLuceneWork(WorkPlan.java:155)
    at org.hibernate.search.backend.impl.WorkQueue.prepareWorkPlan(WorkQueue.java:114)
    at org.hibernate.search.backend.impl.BatchedQueueingProcessor.prepareWorks(BatchedQueueingProcessor.java:55)
    at org.hibernate.search.backend.impl.PostTransactionWorkQueueSynchronization.beforeCompletion(PostTransactionWorkQueueSynchronization.java:64)
    at org.hibernate.search.backend.impl.EventSourceTransactionContext$BeforeCommitSynchronizationDelegator.beforeCompletion(EventSourceTransactionContext.java:204)
    at org.hibernate.resource.transaction.internal.SynchronizationRegistryStandardImpl.notifySynchronizationsBeforeTransactionCompletion(SynchronizationRegistryStandardImpl.java:60)
    ... 84 more
Caused by: java.lang.IllegalArgumentException: Invoking designation with wrong parameters
    at org.hibernate.annotations.common.reflection.java.JavaXProperty.invoke(JavaXProperty.java:87)
    at org.hibernate.annotations.common.reflection.java.JavaXProperty.invoke(JavaXProperty.java:99)
    at org.hibernate.search.util.impl.ReflectionHelper.getMemberValue(ReflectionHelper.java:90)
    ... 99 more
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.String field entity.QuotationArticleEntity.designation to entity.QuotationItemEntity
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
    at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
    at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
    at java.lang.reflect.Field.get(Field.java:393)
    at org.hibernate.annotations.common.reflection.java.JavaXProperty.invoke(JavaXProperty.java:80)
    ... 101 more

Что я вижу, так это то, что DocumentBuilderIndexedEntity.buildDocumentFieldsForProperties() поиска Hibernate Search пытается получить доступ к членам каждого собранных метаданных по всем дочерним классам (через typeMetadata.getAllPropertyMetadata()) в all это дочерние классы, поэтому QuotationArticleEntity.designation нельзя применять к QuotationItemEntity.

Примечания:

  • Использование @IndexedEmbedded (targetElement = QuotationArticleEntity.class) не решило проблему
  • У меня возникла проблема в Hibernate Search 5.5.2. Версия 5.5.10, похоже, не модифицирована для решения этой проблемы

Есть ли способ исправить это или это проблема поиска Hibernate?

С уважением

1 Ответ

0 голосов
/ 08 ноября 2018

Попробуйте использовать

@Inheritance(strategy = InheritanceType.JOINED)

Вот полезная ссылка:

Хорошо, не могли бы вы попробовать

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

Если вы хотите использовать

 @Inheritance(strategy = InheritanceType.JOINED)

Попробуйте использовать какой-нибудь идентификатор в своем абстрактном классе и в каждом подклассе

@PrimaryKeyJoinColumn()
...