我有一个用于连接到MySQL
的应用程序,并且我有Hibernate
配置像这样:
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://somehost:3306/some_db</property>
...
现在,如果我想连接到Hive/SparkSQL
这些属性的等效值是?
我对driver_class
和url
有一些想法(假设我们使用端口10000
),但dialect
应该是什么?
<property name="hibernate.connection.driver_class">org.apache.hive.jdbc.HiveDriver</property>
<property name="hibernate.connection.url">jdbc:hive2://someHost:10000</property>
更新
我尝试了很多不同的价值观,但都不起作用。(我还没有要了解Apache Hive安装使用的元存储,请在此处我只是在试错)
org.hibernate.dialect.MySQLDialect
org.hibernate.dialect.MySQLInnoDBDialect
org.hibernate.dialect.DerbyDialect
org.hibernate.dialect.DerbyTenFiveDialect
org.hibernate.dialect.Oracle10gDialect
org.hibernate.dialect.H2Dialect
org.hibernate.dialect.Dialect
我注意到,在所有情况下休眠说:
WARN JdbcServicesImpl,main:160 -
HHH000341: Could not obtain connection metadata :
Method not supported
然后代码将运行到org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure()
中的NullPointerException
(4.2.0.最终版第207行)。
我下载了Hibernate的源代码并跟踪了逻辑。导致异常的原因是变量前面的几行dialect
(Dialect
类型)被确定为null
,这是由于尝试执行第138行时捕获的异常:
metaReportsDDLCausesTxnCommit = meta.dataDefinitionCausesTransactionCommit();
是个例外
java.sql.SQLException: Method not supported
(导致上述警告信息)
这是否意味着我不能将Hibernate
与Apache Hive一起使用?如果是这样的话,那就顺其自然吧将Hibernate
实现替换为该部分)但我很想知道权威的答案关于这个。
在互联网上我找不到有力的证据人们已经在Apache Hive中成功地使用了CCD_ 15。
我在这里回答我自己的问题。
我认为Hibernate的答案是"没有——Hive/SparkSQL没有方言"。显然,Hibernate中不支持HiveServer2(即不支持Hive Metastore)。截至目前(2017-10-19),我相信这是真的(95%的信心)。
在我的案例中,我最终重写了代码,并将Hibernate代码替换为直接JDBC代码。我很幸运,那里的Hibernate代码只是用于简单的DB查询(session.createSQLQuery()
),而不是严重的ORM,所以更改相对容易。