线程"main"中的异常java.lang.IllegalArgumentException:java.lang.Object不是索引实体或索引实体的子类 [英] Exception in thread "main" java.lang.IllegalArgumentException: java.lang.Object is not an indexed entity or a subclass of an indexed entity

查看:51
本文介绍了线程"main"中的异常java.lang.IllegalArgumentException:java.lang.Object不是索引实体或索引实体的子类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

正在尝试配置HibernateSearch进行ElasticSearch集成.我的oracle数据库中有 Product 表.在该表中,我试图根据产品名称进行搜索.

Am trying to configure HibernateSearch for ElasticSearch Integration. I have Product table in my oracle database. From that table am trying to search based on product name.

为此,我试图将HibernateSearch(ElasticSearch)与oracle数据库集成在一起.

For that am trying to integrate HibernateSearch (ElasticSearch) along with oracle database.

我从HibernateSearch收到以下错误:

Am getting the below error from HibernateSearch :

我正在使用Oracle数据库,并在我的pom.xml文件中添加了必需的依赖项

Am using Oracle database and added the required dependencies in my pom.xml file

Exception in thread "main" java.lang.IllegalArgumentException: java.lang.Object is not an indexed entity or a subclass of an indexed entity
at org.hibernate.search.batchindexing.impl.MassIndexerImpl.toRootEntities(MassIndexerImpl.java:87)
at org.hibernate.search.batchindexing.impl.MassIndexerImpl.<init>(MassIndexerImpl.java:63)
at org.hibernate.search.batchindexing.impl.DefaultMassIndexerFactory.createMassIndexer(DefaultMassIndexerFactory.java:33)
at org.hibernate.search.impl.FullTextSessionImpl.createIndexer(FullTextSessionImpl.java:175)
at com.test.webservice.elasticsearch.App.doIndex(App.java:36)
at com.test.webservice.elasticsearch.App.main(App.java:109)

我正在使用所有最新的依赖项.

Am using all the latest dependencies.

hibernate-search-orm ->5.9.1.Final
hibernate-core ->5.2.16.Final`
ojdbc14 -> 10.2.0.4.0

App.java

public class App 
{

    private static void doIndex() throws InterruptedException {
        Session session = HibernateUtil.getSession();

        FullTextSession fullTextSession = Search.getFullTextSession(session);
        fullTextSession.createIndexer().startAndWait();   // Error occuring on this line

        fullTextSession.close();
    }

    private static List<Product> search(String queryString) {
        Session session = HibernateUtil.getSession();
        FullTextSession fullTextSession = Search.getFullTextSession(session);

        QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Product.class).get();
        org.apache.lucene.search.Query luceneQuery = queryBuilder.keyword().onFields("name").matching(queryString).createQuery();

        // wrap Lucene query in a javax.persistence.Query
        org.hibernate.Query fullTextQuery = fullTextSession.createFullTextQuery(luceneQuery, Product.class);

        List<Product> productList = fullTextQuery.list();

        fullTextSession.close();

        return productList;
    }

    private static void displayContactTableData() {
        Session session = null;
        PropertiesFile propertiesFile= PropertiesFile.getInstance();
        String driverClass = propertiesFile.extractPropertiesFile().getProperty("hibernate.connection.driver_class");
        String connectionURL = propertiesFile.extractPropertiesFile().getProperty("hibernate.connection.url");
        String userName = propertiesFile.extractPropertiesFile().getProperty("hibernate.connection.username");
        String password = propertiesFile.extractPropertiesFile().getProperty("hibernate.connection.password");
        String dialect = propertiesFile.extractPropertiesFile().getProperty("hibernate.dialect");
        String showSQL = propertiesFile.extractPropertiesFile().getProperty("hibernate.show_sql");

        try {
            //session = HibernateUtil.getSession();

            // Fetching saved data
            String hql = "from Product"; 
            @SuppressWarnings("unchecked")

             Configuration cfg=new Configuration()
            .setProperty("hibernate.connection.driver_class", driverClass)
            .setProperty("hibernate.connection.url", connectionURL)
            .setProperty("hibernate.connection.username", userName)
            .setProperty("hibernate.connection.password", password)
            .setProperty("hibernate.dialect", dialect)
            .setProperty("hibernate.show_sql", showSQL)
            .addAnnotatedClass(com.test.webservice.model.Product.class);

             SessionFactory factory=cfg.buildSessionFactory();  
             session=factory.openSession();  
             Transaction t=session.beginTransaction(); 

            List<Product> productList = session.createQuery(hql).list();

            for (Product product : productList) {
                System.out.println("Product Name --->"+product.getName());
            }

        } catch(HibernateException exception){
             System.out.println("Problem creating session factory");
             exception.printStackTrace();
        }finally{
            if(session != null) {
                session.close();
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        System.out.println("\n\n******Data stored in Contact table******\n");
        displayContactTableData();

        // Create an initial Lucene index for the data already present in the database
        doIndex();   // Error occuring on this line

        Scanner scanner = new Scanner(System.in);
        String consoleInput = null;

        while (true) {
            // Prompt the user to enter query string
            System.out.println("\n\nEnter search key (To exit type 'X')");      
            System.out.println();
            consoleInput = scanner.nextLine();

            if("X".equalsIgnoreCase(consoleInput)) {
                System.out.println("End");
                System.exit(0);
            }   

            List<Product> result = search(consoleInput);            
            System.out.println("\n\n>>>>>>Record found for '" + consoleInput + "'");

            for (Product product : result) {
                System.out.println(product);
            }               
        }           
    }
}

hibernate.cfg.xml

hibernate.cfg.xml

<hibernate-configuration>
    <session-factory>

        <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:xe</property>
        <property name="hibernate.connection.username">vb</property>
        <property name="hibernate.connection.password">123456</property>
        <property name="hibernate.dialect">org.hibernate.dialect.OracleDialect</property>
        <property name="show_sql">false</property>
        <property name="format_sql">true</property>

        <property name="hibernate.hbm2ddl.auto">update</property>

        <property name="hibernate.search.default.directory_provider">filesystem</property>
        <property name="hibernate.search.default.indexBase">C:\lucene\indexes</property>

        <mapping class="com.test.webservice.model.Product" />

    </session-factory>
</hibernate-configuration>

Product.java

Product.java

@Entity
@Indexed
@Table(name = "PRODUCT")
public class Product {

    private String name;
    private long id;

    @Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    public void setId(long id) {
        this.id = id;
    }

    @Id
    public long getId() {
        return id;
    }

}

推荐答案

错误消息是错误的,应该是"java.lang.Object不是索引实体或索引的超类实体".我创建了票证,我们将尽快修复错误消息.

The error message is wrong, it should be "java.lang.Object is not an indexed entity or a superclass of an indexed entity". I created a ticket, we'll fix the error message ASAP.

关于您的问题,此异常意味着 Object 或其任何子类均未索引.简而言之,没有任何索引类.

Regarding your problem, this exception means neither Object nor any of its subclasses is indexed. In short, there isn't any indexed class.

我可以看到您的 Product 类已用 @Indexed 进行注释,因此这可能意味着您如何在 HibernateUtil .

I can see that your Product class is annotated with @Indexed, so this probably means there is a problem with how you start Hibernate ORM in HibernateUtil.

您在 displayContactTableData()中注释了 session = HibernateUtil.getSession(); 这一行的简单事实使我觉得您已经知道了.

The simple fact that you commented your line session = HibernateUtil.getSession(); in displayContactTableData() makes me think you already knew that, though.

您应该看一下入门指南确保您正确启动Hibernate ORM.

You should have a look at the getting started guide to make sure you start Hibernate ORM correctly.

这篇关于线程"main"中的异常java.lang.IllegalArgumentException:java.lang.Object不是索引实体或索引实体的子类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆