1

JPA で Hibernate Search を 2 日間使用しようとしましたが、すべてがきれいにコンパイルされ、明白なエラーなしで実行されています。ただし、最初のインデックスを作成しようとすると、プログラムが実行され、インデックスを作成している各オブジェクトが (手動インデックスを使用して) 表示され、"Indexing Completed" メッセージが表示されます。いいえ、エラーはスローされませんが、メイン メソッドは終了しません。jre1.7 を使用して Maven プロジェクトの Eclipse Kepler で実行しているため、赤い停止ボタンを押すことで処理を強制終了できます。私がそうすると、インデックスファイルのファイル検索を行いますが、何も見つかりません。検索プログラムを実行すると、 java.lang.IllegalArgumentException: None of the specified entity types or any of their subclasss are indexed が発生します。

これを機能させる方法についての提案を本当に感謝します。休止状態検索のバージョン 4.2 に戻そうとしましたが、同じ結果が得られました。

ドメイン クラスは Car です。インデクサーの出力は次のとおりです。

    Indexing: Make Infinity Model G35
    Indexing: Make Honda Model Civic
    Indexing: Make Audi Model A4
    Indexing: Make Toyota Model Carolla
    Indexing Completed

デバッガーで実行すると、プログラムが終了しているはずのときに、デバッグ ウィンドウに次のアクティブなスレッドが表示されます。

com.xyzco.search.Indexer at localhost:52231 
    Daemon Thread [MySQL Statement Cancellation Timer] (Running)    
    Thread [Hibernate Search: Index updates queue processor for index com.xyzco.search.Car-1] (Running) 
    Thread [Hibernate Search: IndexWriter worker executor for com.xyzco.search.Car-1] (Running) 
    Thread [DestroyJavaVM] (Running)

インデクサーのコードは次のとおりです。

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.hibernate.search.jpa.FullTextEntityManager;

public class Indexer {
    public static void main(String[] args) {
        try {
            EntityManagerFactory entityManagerFactory = Persistence
                    .createEntityManagerFactory("dbschema");
            EntityManager em = entityManagerFactory.createEntityManager();

            FullTextEntityManager ftem = org.hibernate.search.jpa.Search
                    .getFullTextEntityManager(em);
            ftem.getTransaction().begin();

            @SuppressWarnings("unchecked")
            List<Car> cars = em.createQuery(
                    "select c from Car c").getResultList();
            for (Car car : cars) {
                ftem.index(car); // manually index an item instance
                System.out.println("Indexing: Make " + car.getMake() + " Model " + car.getModel());
            }
            ftem.getTransaction().commit(); // index are written at commit time
            em.close();
            System.out.println("Indexing Completed");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Car クラスのコードは次のとおりです。

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import org.hibernate.search.annotations.Analyze;
import org.hibernate.search.annotations.DocumentId;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Index;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.Store;

@Entity
@Indexed  //Mark for indexing
public class Car {

    @Id @GeneratedValue
    @DocumentId  //Mark id property shared by Core and Search
    private Integer id;

    @Field   //Mark for indexing using tokenization
    private String make;

    @Field  
    private String model;

    @Field(index=Index.YES, analyze=Analyze.NO, store=Store.NO)
    private String description;

    @Field(index=Index.YES, analyze=Analyze.NO, store=Store.NO)
    private String options;

    // getters and setters left out...

}

ここにpersistence.xmlがあります

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
    http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
    version="1.0">
    <persistence-unit name="dbschema"> <!--  transaction-type="RESOURCE_LOCAL"> -->
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>com.xyzco.search.Car</class> 
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>

            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/referencedata"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value=""/>

            <property name="hibernate.search.default.directory_provider"
                value="filesystem" />
            <property name="hibernate.search.default.indexBase" value="/usr/lucene/indexes" />
        </properties>
    </persistence-unit>
</persistence>

これはPOMの一部です(Hibernateサイトで提案されているプロファイルを使用)

...
<profile>
    <id>jboss-public-repository</id>
...         
<dependencies>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${sl4j.version}</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.14</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
    </dependency>
    <dependency>
        <groupId>javax.inject</groupId>
        <artifactId>javax.inject</artifactId>
        <version>1</version>
    </dependency>

    <!-- HIBERNATE SEARCH -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>4.2.2.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-search</artifactId>
        <version>4.3.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-core</artifactId>
        <version>3.6.2</version>
    </dependency>
</dependencies>
4

1 に答える 1

0

インデクサー クラスでは、エンティティ マネージャー (em.close) を閉じた後、エンティティ マネージャー ファクトリ (entityManagerFactory.close();) を閉じる必要があります。そうしないと、プログラムがハングします。これは FAQ リストで説明されており、一般的な問題ですが、コードの断片のみを示しており、この行が含まれていない例が多いのは驚くべきことです。

于 2013-08-18T14:50:06.443 に答える