Я пытаюсь интегрировать Hibernate Search в приложение Spring Boot 2. Я пробовал разные версии, следуя списку совместимости на их сайте, но всегда получаю эту ошибку при запуске приложения и "fullTextEntityManager.createIndexer().startAndWait();" выполняется:
Исключение в потоке "main" java.lang.IllegalArgumentException: HSEARCH000349: некоторые из указанных типов сущностей ("класс java.lang.Object") не индексируются, равно как и их подклассы.
После 3 дней гугления и перепробования многих вещей я понятия не имею, что еще я могу сделать.
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
...
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>${opencsv.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search-orm</artifactId>
<version>5.10.6.Final</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-spatial</artifactId>
<version>5.5.5</version>
</dependency>
</dependencies>
Поскольку конфигурация источника данных обрабатывается весенней загрузкой, у меня нет файла persistence.xml, поэтому я поместил свойства Hibernate Search в application.properties. На самом деле я поместил эти свойства также в hibernate.properties, пытаясь заставить это работать.
application.properties
...
spring.datasource.username=*******
spring.datasource.password=*******
spring.jpa.database=MYSQL
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql=false
spring.jpa.hibernate.naming.physicalstrategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.hibernate.search.default.directory_provider=filesystem
spring.jpa.hibernate.search.default.indexBase=/lucene/indexes
hibernate.properties
hibernate.search.default.directory_provider=filesystem
hibernate.search.default.indexBase=/lucene/indexes
Мой объект Ресторан для индексации:
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@Indexed
@Spatial
@Entity
@Table(name = "restaurant")
public class Restaurant {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Field(index = Index.YES, analyze = Analyze.NO, store = Store.YES)
private String name;
private String address;
@Latitude
private Double latitude;
@Longitude
private Double longitude;
}
Я запускаю Hibernate Search сразу после запуска весенней загрузки
@SpringBootApplication
public class PlacesApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context =
SpringApplication.run(PlacesApplication.class, args);
context.getBean(HibernateSearchService.class)
.initializeHibernateSearch();
}
А моя служба поиска Hibernate выглядит так:
@AllArgsConstructor
@Service
@Slf4j
public class HibernateSearchService {
private EntityManager entityManager;
@Transactional
public void initializeHibernateSearch() {
try {
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
fullTextEntityManager.createIndexer().startAndWait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}