Lucene Hibernate搜索不适用于使用@IdClass的复合主键

Lucene Hibernate搜索不适用于使用@IdClass的复合主键,lucene,hibernate-search,Lucene,Hibernate Search,我已经为我的类配置了hibernate搜索注释(4.1.1版本库)。所以,我使用的是jpa,在我的例子中,我可以省略@DocumentId,但我有一个复合主键。。。 我……你能帮我吗 错误:HSEARCH000058:HSEARCH000116:MassIndexer操作期间出现意外错误 java.lang.ClassCastException:it.domain.InterventoPK不能强制转换为java.lang.Integer 位于org.hibernate.type.descr

我已经为我的类配置了hibernate搜索注释(4.1.1版本库)。所以,我使用的是jpa,在我的例子中,我可以省略
@DocumentId
,但我有一个复合主键。。。

我……你能帮我吗

错误:HSEARCH000058:HSEARCH000116:MassIndexer操作期间出现意外错误 java.lang.ClassCastException:it.domain.InterventoPK不能强制转换为java.lang.Integer 位于org.hibernate.type.descriptor.java.IntegerTypeDescriptor.unwrap(IntegerTypeDescriptor.java:36) 位于org.hibernate.type.descriptor.sql.IntegerTypeDescriptor$1.doBind(IntegerTypeDescriptor.java:57) 位于org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:92) 位于org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:305) 位于org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:300) 位于org.hibernate.loader.loader.bindpositionparameters(loader.java:1891) 位于org.hibernate.loader.loader.bindParameterValues(loader.java:1862) 位于org.hibernate.loader.loader.prepareQueryStatement(loader.java:1737) 位于org.hibernate.loader.loader.doQuery(loader.java:828) 在org.hibernate.loader.loader.doQueryAndInitializeNonLazyCollections(loader.java:289)上 位于org.hibernate.loader.loader.doList(loader.java:2447) 位于org.hibernate.loader.loader.doList(loader.java:2433) 位于org.hibernate.loader.loader.listIgnoreQueryCache(loader.java:2263) 位于org.hibernate.loader.loader.list(loader.java:2258) 位于org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:122) 位于org.hibernate.internal.SessionImpl.list(SessionImpl.java:1535) 位于org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:374) 位于org.hibernate.search.batchindexing.impl.IdentifierConsumerEntityProducer.loadList(IdentifierConsumerEntityProducer.java:150) 位于org.hibernate.search.batchindexing.impl.IdentifierConsumerEntityProducer.loadAllFromQueue(IdentifierConsumerEntityProducer.java:117) 位于org.hibernate.search.batchindexing.impl.IdentifierConsumerEntityProducer.run(IdentifierConsumerEntityProducer.java:94) 在org.hibernate.search.batchindexing.impl.OptionallyWrapInJTATransaction.run上(OptionallyWrapInJTATransaction.java:84) 位于java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
在java.lang.Thread.run(Thread.java:619)

中,您声明为复合键的类(通过@IdClass class level注释声明的it.domain.interfertopk.class)是否只包含两个整数字段?由于您在INTERVICTO类上还用@Id注释了两个这样的整型字段,因此复合键类必须只包含这些字段,并且它们必须具有相同的名称。此外,复合PK类需要是可序列化的。从文档中:

“将多个属性映射为@Id属性,并将外部类声明为标识符类型。这个需要序列化的类通过@IdClass注释在实体上声明。标识符类型必须包含与实体的标识符属性相同的属性:每个属性名称必须相同,其类型也必须相同如果实体属性为基本类型,则其类型必须为关联实体的主键类型(如果实体属性为关联)(一个@OneToOne或@ManyToOne)。”


(在页面中搜索“复合标识符”)

您的类是否声明为复合键(it.domain.interfertopk.class,通过@IdClass class-level注释声明)仅包含两个整型字段?由于您在INTERVICTO类上还用@Id注释了两个整型字段,因此复合密钥类必须仅包含这些字段,并且它们必须具有相同的名称。此外,复合PK类还需要可序列化。从文档:

"将多个属性映射为@Id properties,并将外部类声明为标识符类型。此类需要序列化,通过@IdClass注释在实体上声明。标识符类型必须包含与实体标识符属性相同的属性:每个属性名称必须相同,其类型必须相同同样,如果实体属性是基本类型,则其类型必须是关联实体的主键类型(如果实体属性是关联(@OneToOne或@ManyToOne)。”


(在第页中搜索“复合标识符”)

Hibernate搜索不处理与@IdClass一起使用的复合id类。解决方法是使用@EmbeddedId,并将idintervento和Linguaid放入Interfertopk中


似乎您在Hibernate搜索论坛上也问了同样的问题-

Hibernate搜索不处理与@IdClass一起使用的复合id类。解决方法是使用@EmbeddedId,并将IDiterVento和linguaIdlingua放入Interfertopk


似乎你在Hibernate搜索论坛上也问了同样的问题-

我已经在Hibernate论坛上回答了你的问题,但为了完成我的建议:

更改映射的另一种方法是在新的getter上添加@DocumentId,并返回任何对象(甚至可能是字符串),这是两个ids组件的唯一组合。 (但这需要在getter和setter上定义映射)


使用JPA时,您可以避免指定@DocumentId,但不必指定,您仍然可以使用注释覆盖要应用于索引映射的标识定义。

我已经在Hibernate论坛上回答了您的问题,但为了完成我的建议:

更改映射的另一种方法是在新的getter上添加@DocumentId,并返回任何对象,甚至可能是str
@IdClass(it.domain.InterventoPK.class)
@Entity
@Indexed
@AnalyzerDef(name = "interventongram", tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
     @TokenFilterDef(factory = LowerCaseFilterFactory.class),
     @TokenFilterDef(factory = StopFilterFactory.class, params = {
         @Parameter(name = "words", value = "lucene/dictionary/stopwords.txt"),
         @Parameter(name = "ignoreCase", value = "true"),
         @Parameter(name = "enablePositionIncrements", value = "true")
     }),
     @TokenFilterDef(factory = ItalianLightStemFilterFactory.class),
     @TokenFilterDef(factory = SynonymFilterFactory.class, params = {
         @Parameter(name = "synonyms", value = "lucene/dictionary/synonyms.txt"),
         @Parameter(name = "expand", value = "true")
     }),
     @TokenFilterDef(factory = SnowballPorterFilterFactory.class, params = {
            @Parameter(name = "language", value = "Italian")
     })
})



@Table(name = "intervento", catalog = "gestionale")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace = "Clinigo/it/domain", name = "Intervento")
@XmlRootElement(namespace = "Clinigo/it/domain")
public class Intervento implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     */

    @Column(name = "idintervento", nullable = false)
    @Basic(fetch = FetchType.EAGER)
    @Id
    @XmlElement
    Integer idintervento;
    /**
     */

    @Column(name = "lingua_idlingua", nullable = false)
    @Basic(fetch = FetchType.EAGER)
    @Id
    @XmlElement
    Integer linguaIdlingua;
    /**
     */
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "version", nullable = false)
    @Basic(fetch = FetchType.EAGER)
    @XmlElement
    Calendar version;
@Entity
@Indexed
public class Person {
@EmbeddedId @DocumentId Embedded id
@FieldBridge(impl=PersonPkBridge.class)
private PersonPK id;
...
}