J'essaye d'intégrer le pilote élastique "org.elasticsearch.xpack.sql.jdbc.EsDriver" de
Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:275)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:152)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:179)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:119)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:904)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:935)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:390)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:377)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1837)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1774)
... 16 common frames omitted
Caused by: org.hibernate.HibernateException: Unable to construct requested dialect [org.elasticsearch.xpack.sql.jdbc.EsDriver]
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.constructDialect(DialectFactoryImpl.java:84)
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:51)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:137)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:94)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263)
... 33 common frames omitted
Caused by: java.lang.ClassCastException: org.elasticsearch.xpack.sql.jdbc.EsDriver cannot be cast to org.hibernate.dialect.Dialect
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.constructDialect(DialectFactoryImpl.java:74)
... 38 common frames omitted
dans mon application de démarrage de printemps en utilisant Hibernate.
Dans mon bean de configuration de printemps, j'ai ce qui suit:
@Bean
@ConfigurationProperties(prefix = "db.elastic")
@Qualifier("elasticDataSource")
@Primary
public DataSource elasticDataSource() {
return DataSourceBuilder.create()
.build();
}
public LocalContainerEntityManagerFactoryBean elasticEntityManagerFactory(
EntityManagerFactoryBuilder builder) {
Map<String, Object> properties = new HashMap<>();
properties.put(AvailableSettings.HBM2DDL_AUTO, "none");
properties.put(AvailableSettings.HBM2DLL_CREATE_SCHEMAS, "false");
properties.put(AvailableSettings.DIALECT, org.elasticsearch.xpack.sql.jdbc.EsDriver.class.getName());
return builder
.dataSource(elasticDataSource())
.packages(Issuer.class)
.persistenceUnit("elastic")
.properties(properties)
.build();
}
Cependant, lorsque j'exécute ce code, j'obtiens l'exception suivante:
<dependency> <groupId>org.elasticsearch.plugin</groupId> <artifactId>x-pack-sql-jdbc</artifactId> <version>7.10.0</version> </dependency>
Je suppose que c'est parce que le pilote n'est pas compatible avec la mise en veille prolongée. Ai-je raison ou y a-t-il une autre configuration à effectuer pour contourner le problème?
Il existe également un pilote JDBC disponible dans le commerce ici: https://www.cdata.com/drivers/elasticsearch/jdbc/
Quelqu'un at-il une expérience avec ce pilote et sa compatibilité avec Hibernate?
3 Réponses :
Je n'ai aucune connaissance du pilote ElasticSearch, mais je vais vous dire pourquoi vous obtenez l'erreur.
Votre erreur est: Causée par: java.lang.ClassCastException: org.elasticsearch.xpack.sql.jdbc.EsDriver ne peut pas être converti en org.hibernate.dialect.Dialect
C'est parce que vous avez un problème dans vos propriétés:
properties.put (AvailableSettings.DIALECT, org.elasticsearch.xpack.sql.jdbc.EsDriver.class.getName ());
EsDrver.class.getName () n'est pas un dialecte de mise en veille prolongée.
Un exemple de dialecte d'hibernation est: org.hibernate.dialect.MySQL5Dialect
Veuillez lire https://www.elastic.co/guide/en/elasticsearch/reference/current/sql-jdbc.html
Voyant que vous utilisez Springboot, vous n'aurez peut-être même pas à configurer manuellement la source de données / le gestionnaire d'entités. Le simple fait d'ajouter la dépendance la configurera automatiquement.
Il n'y a pas de dialecte pour le dialecte ElasticSearch SQL, mais vous pouvez essayer d'utiliser org.hibernate.dialect.SQLServerDialect comme suggéré dans https://www.cdata.com/kb/tech/elasticsearch-jdbc-hibernate.rst
En fin de compte, vous devrez probablement remplacer quelques configurations dans le dialecte pour s'adapter au dialecte SQL pris en charge par ES.
J'ai donc trouvé que org.hibernate.dialect.H2Dialect ou org.hibernate.dialect.PostgreSQL9Dialect fonctionnent, mais seulement jusqu'à un certain point.
Tout d'abord, vous devez également inclure des guillemets doubles dans les noms d'entités:
18:14:29.320 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL -
select
mytabl_.NAME as col_0_0_
from
"mytable" mytabl_
order by
mytabl_.NAME asc limit ?
18:14:29.651 [http-nio-8081-exec-1] WARN o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 0, SQLState: null
18:14:29.651 [http-nio-8081-exec-1] ERROR o.h.e.jdbc.spi.SqlExceptionHelper - line 1:108: mismatched input '?' expecting {'ALL', INTEGER_VALUE}
18:14:29.658 [http-nio-8081-exec-1] WARN g.e.SimpleDataFetcherExceptionHandler - Exception while fetching data (/Issuers) : line 1:108: mismatched input '?' expecting {'ALL', INTEGER_VALUE}
org.hibernate.JDBCException: line 1:108: mismatched input '?' expecting {'ALL', INTEGER_VALUE}
De plus, j'ai trouvé que la configuration de maxRows ne fonctionne pas. Pour une raison quelconque, cette valeur n'est pas liée à une limite dans le Sql généré:
@Data
@Table(name = "\"mytable\"")
@Entity
public class MyTable {
}
Quelqu'un a des idées sur pourquoi cela pourrait être?