【发布时间】: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