【问题标题】:Hibernate 5.0 dialect auto detection not working with JNDI on TomcatHibernate 5.0 方言自动检测不适用于 Tomcat 上的 JNDI
【发布时间】:2016-04-21 00:46:35
【问题描述】:

我正在尝试连接到 Tomcat 的 server.xml 中指定的 JNDI 数据源。 我的 hibernate.cfg.xml 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.datasource">java:comp/env/jdbc/myDB</property>
        <property name="hibernate.hbm2ddl.auto">create</property>
        <property name="hibernate.dialect">org.hibernate.dialect.org.hibernate.dialect.DerbyDialect</property>
        <property name="hibernate.current_session_context_class">org.hibernate.context.internal.ThreadLocalSessionContext</property>
        <mapping class="com.gigatronik.bosch.plugin.remoteserver.db.ConnectEntity"/>
    </session-factory>

</hibernate-configuration>

在我删除 hibernate.dialect 属性之前一切正常(所以我假设我的配置是正确的)——它隐式启用了方言自动检测:

WARN [http-apr-8080-exec-9] org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService HHH000342: Could not obtain connection to query metadata : Cannot create JDBC driver of class '' for connect URL 'null'

Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:100) ~[hibernate-core-5.0.5.Final.jar:5.0.5.Final]
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:54) ~[hibernate-core-5.0.5.Final.jar:5.0.5.Final]
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:137) ~[hibernate-core-5.0.5.Final.jar:5.0.5.Final]
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) ~[hibernate-core-5.0.5.Final.jar:5.0.5.Final]
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:88) ~[hibernate-core-5.0.5.Final.jar:5.0.5.Final]
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:234) ~[hibernate-core-5.0.5.Final.jar:5.0.5.Final]
... 78 more

使用 Jetty,自动发现功能非常有效。似乎只有 Apache Tomcat 有这个问题。如何使用 Tomcat 启用自动检测?

更新: 我的 Tomcat 配置:

...
<GlobalNamingResources>
...

<Resource name="jdbc/myDB" auth="Container" type="javax.sql.DataSource"
driverClassName="org.apache.derby.jdbc.EmbeddedDriver" 
url="jdbc:derby:myDB;create=true"
maxTotal="100" maxIdle="30" maxWaitMillis="10000" />
...
</GlobalNamingResources>

【问题讨论】:

  • 我假设您已经在 tomcat 中配置了 'java:comp/env/jdbc/myDB',因为您在 hibernate 配置中引用了它,但不要在您的描述中引用它完毕?如果你这样做了:让我们知道如何。如果你没有:去做吧。
  • 自动发现仅适用于直接数据库连接,不使用 JNDI。您可以将 dialect 属性作为 JNDI 值存储在服务器上,并在配置 Hibernate 时读取它。
  • @OlafKock 我已经用我的 tomcat 配置更新了最初的帖子。对吗?
  • @Stefan 但是为什么在使用 Jetty 时它会起作用?

标签: hibernate tomcat jdbc jndi


【解决方案1】:

终于找到问题原因了:

应用程序的 context.xml 中的 ResourceLink 未定义。在我另外定义之后

<Context path="/foo.bar">
    <ResourceLink global="jdbc/myDB" name="jdbc/myDB" type="javax.sql.DataSource"/>
</Context>

连接终于成功了。事件 JNDI 现在确实有效。所以事实上@Stefan 对我的问题的评论根本不正确。

因此,请注意不能很好地描述问题原因的休眠错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 2020-07-25
    相关资源
    最近更新 更多