【问题标题】:Hibernate Search : IllegalArgumentException while indexing a child class @Field using @IndexedEmbedded休眠搜索:使用@IndexedEmbedded 索引子类@Field 时出现IllegalArgumentException
【发布时间】:2018-11-08 12:07:19
【问题描述】:

我在 Hibernate 事务的提交阶段为新记录编制索引时遇到了IllegalArgumentException

我有以下配置:

@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

我可以看到的是,Hibernate Search 的 DocumentBuilderIndexedEntity.buildDocumentFieldsForProperties() 试图访问 all 上所有子类(通过 typeMetadata.getAllPropertyMetadata())收集的元数据的成员 all 子类,这就是 QuotationArticleEntity.designation 不能应用于 QuotationItemEntity 的原因。

备注:

  • 使用@IndexedEmbedded(targetElement = QuotationArticleEntity.class) 没有解决问题
  • 我在 Hibernate Search 5.5.2 上遇到了这个问题。 5.5.10版本好像没有修改来解决这个问题

有没有办法解决这个问题,或者这是一个 Hibernate 搜索问题?

亲切的问候

【问题讨论】:

  • 看起来像一个错误,但我wasn't able to reproduce it。您应该考虑至少升级到 5.6,这是维护最久的版本,与 5.5 相比,我们解决了很多错误。如果问题仍然存在,您可以在我们的JIRA tracker 上报告它,最好使用基于我们的test case templates 的测试用例,我们会修复它(在 5.6 及更高版本上)。
  • 您好,非常感谢您尝试复制。我更新到您提到的版本,但问题仍然存在。我将尝试更多地调查您的示例和我的示例的差异,并以更新的元素返回给您。我会随时通知您。

标签: java hibernate hibernate-search


【解决方案1】:

尝试使用

@Inheritance(strategy = InheritanceType.JOINED)

这里是有用的链接:

好吧,你可以试试

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

如果你想使用

 @Inheritance(strategy = InheritanceType.JOINED)

尝试在你的抽象类和每个子类中使用一些 id

@PrimaryKeyJoinColumn()

【讨论】:

  • 感谢您的回答。事实上,抽象类已经用这种策略进行了注解。我在总结的例子中没有提到它。我修改帖子以提及它。还是我应该将它添加到其他地方?
  • 更新答案请看)
  • 感谢您的更新。我会尝试看看这是否可以解决问题。韩国。
  • 有帮助吗?
猜你喜欢
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
  • 1970-01-01
相关资源
最近更新 更多