【问题标题】:Hibernate NoSuchFieldError: INSTANCE休眠 NoSuchFieldError: 实例
【发布时间】:2016-06-13 16:14:42
【问题描述】:

我正在尝试将 Hibernate Search 与 Spring Data JPA 集成,因此我编写了一个示例代码来测试它。

@PersistenceContext
EntityManager em;

@Override
@Transactional
public List<Place> findAll() {
    FullTextEntityManager fullTextSession = Search.getFullTextEntityManager(em);

    QueryBuilder builder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Place.class).get();

    double centerLatitude = 0d;
    double centerLongitude = 0d;
    org.apache.lucene.search.Query luceneQuery = builder
            .spatial()
            .within(100, Unit.KM)
            .ofLatitude(centerLatitude)
            .andLongitude(centerLongitude)
            .createQuery();

    javax.persistence.Query jpaQuery =
            fullTextSession.createFullTextQuery(luceneQuery, Place.class);

    em.close();
    return jpaQuery.getResultList();
}

而且我在跟踪堆栈跟踪时遇到了异常。

2016-06-13 17:34:30 INFO  LogHelper:31 - HHH000204: Processing PersistenceUnitInfo [
    name: default
    ...]
2016-06-13 17:34:30 INFO  Version:37 - HHH000412: Hibernate Core {5.0.6.Final}
2016-06-13 17:34:30 INFO  Environment:213 - HHH000206: hibernate.properties not found
2016-06-13 17:34:30 INFO  Environment:317 - HHH000021: Bytecode provider name : javassist
2016-06-13 17:34:30 INFO  Version:66 - HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
2016-06-13 17:34:31 INFO  Dialect:154 - HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
2016-06-13 17:34:31 INFO  Version:30 - HV000001: Hibernate Validator 5.2.4.Final
2016-06-13 17:34:31 INFO  Version:26 - HSEARCH000034: Hibernate Search 5.5.3.Final
2016-06-13 17:34:32 INFO  SchemaUpdate:105 - HHH000228: Running hbm2ddl schema update
2016-06-13 17:34:32 WARN  ConfigContext:346 - HSEARCH000075: Configuration setting hibernate.search.lucene_version was not specified: using LUCENE_CURRENT.
//...    

[localhost-startStop-1] WARN org.springframework.web.context.support.AnnotationConfigWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in pl.project.api.config.RepositoryConfig: Invocation of init method failed; nested exception is java.lang.NoSuchFieldError: INSTANCE
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
//...
Caused by: java.lang.NoSuchFieldError: INSTANCE
    at org.hibernate.search.store.impl.DefaultLockFactoryCreator.createLockFactory(DefaultLockFactoryCreator.java:60)
    at org.hibernate.search.store.impl.DirectoryProviderHelper.getLockFactory(DirectoryProviderHelper.java:134)
    at org.hibernate.search.store.impl.DirectoryProviderHelper.createFSIndex(DirectoryProviderHelper.java:124)
    at org.hibernate.search.store.impl.FSDirectoryProvider.initialize(FSDirectoryProvider.java:53)
    at org.hibernate.search.store.spi.BaseDirectoryProviderService.initialize(BaseDirectoryProviderService.java:64)
    at org.hibernate.search.store.spi.BaseDirectoryProviderService.create(BaseDirectoryProviderService.java:49)
    at org.hibernate.search.indexes.spi.DirectoryBasedIndexManager.createDirectoryProvider(DirectoryBasedIndexManager.java:230)
    at org.hibernate.search.indexes.spi.DirectoryBasedIndexManager.initialize(DirectoryBasedIndexManager.java:90)
    at org.hibernate.search.indexes.impl.IndexManagerHolder.createIndexManager(IndexManagerHolder.java:256)
    at org.hibernate.search.indexes.impl.IndexManagerHolder.createIndexManager(IndexManagerHolder.java:513)
    at org.hibernate.search.indexes.impl.IndexManagerHolder.createIndexManagers(IndexManagerHolder.java:482)
    at org.hibernate.search.indexes.impl.IndexManagerHolder.buildEntityIndexBinding(IndexManagerHolder.java:91)
    at org.hibernate.search.spi.SearchIntegratorBuilder.initDocumentBuilders(SearchIntegratorBuilder.java:358)
    at org.hibernate.search.spi.SearchIntegratorBuilder.buildNewSearchFactory(SearchIntegratorBuilder.java:199)
    at org.hibernate.search.spi.SearchIntegratorBuilder.buildSearchIntegrator(SearchIntegratorBuilder.java:117)
    at org.hibernate.search.hcore.impl.HibernateSearchSessionFactoryObserver.sessionFactoryCreated(HibernateSearchSessionFactoryObserver.java:75)
    at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:530)
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444)
    at     org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
    ... 21 

我正在处理我的依赖项及其版本,但没有任何变化。
我的依赖

    <!-- Hibernate -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-ehcache</artifactId>
        <version>5.0.6.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.0.6.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>5.0.6.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.2.4.Final</version>
    </dependency>
    <dependency>
        <groupId>javax.transaction</groupId>
        <artifactId>jta</artifactId>
        <version>1.1</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-search-orm</artifactId>
        <version>5.5.3.Final</version>
    </dependency>

我也在使用来自 ReleaseTrain (Hopper-SR1) 的 Spring Data JPA,所以它是 Spring Data JPA 1.10.1

My Place.class

@Getter
@Setter
@Entity
@Indexed
@Spatial
public class Place implements Serializable {

    private static final long serialVersionUID = -8379536848917838560L;
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    @Column(name = "place_id")
    private Long id;

    //...
    @Longitude
    private Double lng;

    @Latitude
    private Double lat;
    //...
    }

Here is my RepositoryConfig mvn dependency:tree of my parent module

【问题讨论】:

  • 我知道这可能是依赖问题,但正如我所写,我正在处理版本和依赖关系而没有结果。如何跟踪导致问题的原因
  • 与您的休眠注释 jar 有关。如果它存在于您的依赖项中,请尝试删除它
  • 不幸的是,我的依赖项中从未有过类似的东西
  • 但我发现我在日志中有类似的东西INFO Version:66 - HCANN000001: Hibernate Commons Annotations {5.0.1.Final}

标签: spring hibernate jpa entitymanager hibernate-search


【解决方案1】:

您似乎正在使用不兼容的 Lucene 版本。可以分享运行mvn dependency:tree 的输出吗? Hibernate Search 5.5 与 Lucene 5.3 atm 一起使用。

【讨论】:

  • Gunnar(Hibernate 开发团队的成员!)当然是对的。该错误意味着您有一些不兼容的依赖项;您列出的那些是正确的,但由于其他依赖关系,您可能包括更多。 Hibernate Search 5.5 适用于 Hibernate ORM 5.0.x 和 5.1.x(不适用于 5.2.x),以及 Apache Lucene 5.3.x、5.4.x 和 5.5.x(不适用于 6.0)
  • 我将org.elasticsearch:elasticsearch:jar:1.5.2 从我的项目中踢了出来,因为它有旧版本的org.apache.lucene:lucene-*。现在终于成功了。
  • 酷,很高兴听到。顺便提一句。如果您想使用 Elasticsearch,您可能会对 Hibernate Search 5.6 的 latest Beta 感兴趣,它可以将 Elasticsearch 透明地集成到 Hibernate/JPA 应用程序中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多