2

クラスInterventoをhibernate-searchアノテーション(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(IntegerTypeDescriptor.java: 36)org.hibernate.type.descriptor.sql.IntegerTypeDescriptor $ 1.doBind(IntegerTypeDescriptor.java:57)at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:92)atorg.hibernate。 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 org.hibernate.loader.Loaderの.loader.Loader.bindParameterValues(Loader.java:1862)。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)at org.hibernate.loader.Loader.doList(Loader.java:2433)at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2263)atorg.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)at org.hibernate.search.batchindexing.impl.IdentifierConsumerEntityProducer.loadList(IdentifierConsumerEntityProducer.java:150)atorg.hibernate.search.batchindexing.impl。IdentifierConsumerEntityProducer.loadAllFromQueue(IdentifierConsumerEntityProducer.java:117)at org.hibernate.search.batchindexing.impl.IdentifierConsumerEntityProducer.run(IdentifierConsumerEntityProducer.java:94)at org.hibernate.search.batchindexing.impl.OptionallyWrapInJTATransaction.run( 84)at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:908)at java.lang.Thread.run(Thread .java:619)run(OptionallyWrapInJTATransaction.java:84)at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:908)at java.lang .Thread.run(Thread.java:619)run(OptionallyWrapInJTATransaction.java:84)at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:908)at java.lang .Thread.run(Thread.java:619)

4

4 に答える 4

3

Hibernate Searchは、@IdClassで使用される複合IDクラスを処理しません。回避策は、@ EmbeddedIdを使用し、idinterventolinguaIdlinguaInterventoPK配置することです。

また、Hibernate検索フォーラムで同じ質問をしたようです-https://forum.hibernate.org/viewtopic.php?f=9&t= 1024512

于 2012-10-09T11:57:41.140 に答える
1

ブリッジを使用して、カスタムオブジェクト/複合キーをLuceneUnderstandable形式に変換できます。たとえば、クラスの場合

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

このようにブリッジを書くことができます。これらのコードは、「HibernateSearchInAction」という本からのものです。とても役に立ちました。

于 2013-06-05T10:57:58.353 に答える
0

複合キーとして宣言されたクラス(@IdClassクラスレベルアノテーションを介して宣言されたit.domain.InterventoPK.class)には、2つの整数フィールドしか含まれていませんか?Interventoクラスで@Idを使用してこのような2つの整数フィールドにも注釈を付けているため、複合キークラスにはこれらのフィールドのみが含まれている必要があり、同じ名前である必要があります。また、その複合PKクラスはSerializableである必要があります。ドキュメントから:

"複数のプロパティを@Idプロパティとしてマップし、外部クラスを識別子タイプとして宣言します。シリアル化可能である必要があるこのクラスは、@ IdClassアノテーションを介してエンティティで宣言されます。識別子タイプには、識別子と同じプロパティが含まれている必要がありますエンティティのプロパティ:各プロパティ名は同じである必要があり、エンティティプロパティが基本タイプの場合はそのタイプも同じである必要があり、エンティティプロパティがアソシエーション(@OneToOneまたは@ManyToOneのいずれか)。」

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

(ページの「複合識別子」を検索してください)

于 2012-10-09T09:19:54.740 に答える
0

私はすでにHibernateフォーラムであなたの質問に回答しましたが、私の提案を完了するために:

マッピングを変更する代わりに、新しいゲッターに@DocumentIdを追加して、2つのidsコンポーネントの一意の合成である任意のオブジェクト(場合によっては文字列)を返すこともできます。(ただし、これにはゲッターとセッターのマッピングを定義する必要があります)

JPAを使用する場合、@ DocumentIdの指定を回避できますが、指定する必要はありません。アノテーションを使用して、インデックスマッピングに適用するIDの定義をオーバーライドできます。

于 2012-10-09T13:14:33.760 に答える