2

我已经为我的班级 Intervento 配置了休眠搜索注释(4.1.1 版本库)。所以,我正在使用 jpa,在我的情况下,我可以省略@DocumentId,但我有一个复合主键......

@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;

...

我越来越……你能帮帮我吗?

错误:HSEARCH000058:HSEARCH000116:MassIndexer 操作期间出现意外错误 java.lang.ClassCastException:it.domain.InterventoPK 无法在 org.hibernate.type.descriptor.java.IntegerTypeDescriptor.unwrap 中转换为 java.lang.Integer(IntegerTypeDescriptor.java: 36) 在 org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:92) 在 org.hibernate 的 org.hibernate.type.descriptor.sql.IntegerTypeDescriptor$1.doBind(IntegerTypeDescriptor.java:57)。 type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:305) at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:300) at org.hibernate.loader.Loader.bindPositionalParameters(Loader.java:1891) at org.hibernate .loader.Loader.bindParameterValues(Loader.java:1862) 在 org.hibernate.loader.Loader。prepareQueryStatement(Loader.java:1737) at org.hibernate.loader.Loader.doQuery(Loader.java:828) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289) at 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) at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:122) at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1535) at 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)在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 在 java.lang .Thread.run(Thread.java:619)在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 在 java.lang .Thread.run(Thread.java:619)

4

4 回答 4

3

Hibernate Search 不处理与@IdClass一起使用的复合 id 类。一种解决方法是使用@EmbeddedId并将idinterventolinguaIdlingua放入InterventoPK

似乎您在 Hibernate Search 论坛上也问了同样的问题 - https://forum.hibernate.org/viewtopic.php?f=9&t=1024512

于 2012-10-09T11:57:41.140 回答
1

您可以使用桥将自定义对象/复合键转换为 Lucene 可理解的格式。例如对于一个类

@Entity
@Indexed
public class Person {
@EmbeddedId @DocumentId Embedded id
@FieldBridge(impl=PersonPkBridge.class)
private PersonPK id;
...
}

你可以像这样写桥。这些代码来自“Hibernate Search In Action”一书。我发现它很有帮助。

于 2013-06-05T10:57:58.353 回答
0

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

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

http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/

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

于 2012-10-09T09:19:54.740 回答
0

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

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

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

于 2012-10-09T13:14:33.760 回答