2016-07-05 70 views
0

我想重新索引elasticsearch索引中的實體,使用來自hibernate-search-orm項目的MassIndexer系統重新索引實體。hibernate-search MassIndexer錯誤

這可能很棒;)但它告訴我一些例外。

但是你可以看到下面的例子是基本的:

  1. 實體:

    @Entity 
    @Table(name = "STUDENT") 
    @Indexed 
    @ProvidedId (bridge = @FieldBridge(impl = StudentFieldBridge.class)) 
    public class StudentEntity { 
    
        @EmbeddedId 
        private RegistrationId regid; 
    
        @Field 
        private String name; 
        ... 
    } 
    
  2. registrationId

    @Embeddable 
    public class RegistrationId implements Serializable{ 
    
        @Column(name = "STUDENT_ID") 
        private int studentId; 
    
        @Column(name = "DEPARTMENT") 
        private String department; 
        ... 
    } 
    
  3. 學生場橋:

    public class StudentFieldBridge implements TwoWayStringBridge { 
    
        @Override 
        public Object stringToObject(String stringValue) { 
         String[] split = stringValue.split("_"); 
         RegistrationId ret = new RegistrationId(); 
         ret.setDepartment(split[0]); 
         ret.setStudentId(Integer.parseInt(split[1])); 
         return ret; 
        } 
    
        @Override 
        public String objectToString(Object object) { 
         RegistrationId id = (RegistrationId) object; 
         return id.getDepartment() + "_" + id.getStudentId(); 
        } 
    } 
    
  4. 質量指數

    @Test 
    public void massIndexation() throws InterruptedException { 
        EntityManager em = Persistence.createEntityManagerFactory("studentPu").createEntityManager(); 
        org.hibernate.Session hibernateSession = (Session)em.getDelegate(); 
        FullTextSession fullTextSession = Search.getFullTextSession(hibernateSession); 
        fullTextSession.createIndexer().startAndWait(); 
    } 
    
  5. 最後的錯誤:

    ERROR: HSEARCH000058: HSEARCH000212: An exception occurred while the MassIndexer was transforming identifiers to Lucene Documents 
    java.lang.NullPointerException 
    at org.hibernate.loader.criteria.CriteriaQueryTranslator.getEntityName(CriteriaQueryTranslator.java:626) 
    at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumns(CriteriaQueryTranslator.java:509) 
    at org.hibernate.loader.criteria.CriteriaQueryTranslator.findColumns(CriteriaQueryTranslator.java:525) 
    at org.hibernate.criterion.InExpression.toSqlString(InExpression.java:43) 
    at org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:400) 
    at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:106) 
    at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:75) 
    at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:80) 
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1760) 
    at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:363) 
    at org.hibernate.search.batchindexing.impl.IdentifierConsumerDocumentProducer.loadList(IdentifierConsumerDocumentProducer.java:175) 
    at org.hibernate.search.batchindexing.impl.IdentifierConsumerDocumentProducer.loadAllFromQueue(IdentifierConsumerDocumentProducer.java:140) 
    at org.hibernate.search.batchindexing.impl.IdentifierConsumerDocumentProducer.run(IdentifierConsumerDocumentProducer.java:117) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:744) 
    

Java項目的依賴關係是:

testCompile group: 'org.hibernate', name: 'hibernate-entitymanager', version: '5.0.8.Final' 
testCompile group: 'org.hibernate', name: 'hibernate-search-orm', version: '5.6.0.Alpha3' 
testCompile group: 'org.hibernate', name: 'hibernate-search-backend-elasticsearch', version: '5.6.0.Alpha3' 

由於項目團隊爲你的工作!

回答

0

這應該工作:

@Entity 
@Table(name = "STUDENT") 
@Indexed 
public class StudentEntity { 

    @EmbeddedId 
    @DocumentId 
    @FieldBridge(impl = StudentFieldBridge.class) 
    private RegistrationId regid; 

    @Field 
    private String name; 

的問題是由@ProvidedId註釋,這是不符合MassIndexer兼容引起的:它是爲其他框架與Hibernate Search的集成,以提供直接被分配的ID外部。 如果id是外部分配的,MassIndexer無法猜測它們,所以這些不應該一起使用。

我會盡力澄清關於此問題的ProvidedId的文檔,或者可能會棄用/刪除註釋,因爲我並不認爲它會導致這樣的混淆錯誤。感謝您的報告!

+0

相關問題:https://hibernate.atlassian.net/browse/HSEARCH-1645 – Sanne