Hibernate 5.0方言自动检测在Tomcat上不使用JNDI

Hibernate 5.0方言自动检测在Tomcat上不使用JNDI,hibernate,tomcat,jdbc,jndi,Hibernate,Tomcat,Jdbc,Jndi,我正在尝试连接到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-configu

我正在尝试连接到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>

在Jetty中,自动发现功能非常有效。似乎只有ApacheTomcat有这个问题。如何使用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>
。。。
...
...

我终于找到了问题的原因:

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

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

这种联系终于起作用了。事件JNDI现在可以工作了。所以事实上@Stefan对我的问题的评论根本不正确


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

我终于找到了问题原因:

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

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

这种联系终于起作用了。事件JNDI现在可以工作了。所以事实上@Stefan对我的问题的评论根本不正确


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

我假设您已经在tomcat中配置了“java:comp/env/jdbc/myDB”,因为您在hibernate配置中引用了它,但在您所做的描述中不要引用它?如果你做了:让我们知道怎么做。如果没有,请执行。自动发现仅在直接数据库连接上有效,而不使用JNDI。您可以将方言属性作为JNDI值存储在服务器上,并在配置Hibernate时读取它。@OlafKock我已经用tomcat配置更新了最初的帖子。是正确的吗?@Stefan但是为什么在使用Jetty时它会工作呢?我假设您已经在tomcat中配置了“java:comp/env/jdbc/myDB”,正如您在hibernate配置中引用它一样,但在您对所做工作的描述中不要引用它?如果你做了:让我们知道怎么做。如果没有,请执行。自动发现仅在直接数据库连接上有效,而不使用JNDI。您可以将方言属性作为JNDI值存储在服务器上,并在配置Hibernate时读取它。@OlafKock我已经用tomcat配置更新了最初的帖子。这是正确的吗?@Stefan但为什么在使用Jetty时它会起作用?
<Context path="/foo.bar">
    <ResourceLink global="jdbc/myDB" name="jdbc/myDB" type="javax.sql.DataSource"/>
</Context>