13

我正在使用tomcat连接池,jpa,hibernate。如果我尝试使用以下方式获取它,我在 tomcat 的 context.xml 中创建的数据源可以正常工作:

source = (DataSource) ((Context) c.lookup("java:comp/env")).lookup("jdbc/kids");

但是如果我在 persistence.xml 中指定这个 jndi 数据源

<persistence-unit name="kids-tomcat" transaction-type="JTA">
           <jta-data-source>jdbc/kids</jta-data-source>
       </persistence-unit>

我收到以下异常:org.hibernate.service.jndi.JndiException: Unable to lookup JNDI name [jdbc/kids]

知道为什么会发生!

4

2 回答 2

16

在我指定了下面的属性之后,它终于在今天起作用了。因为仅仅提到数据源是不够的;我们需要指定一些属性,比如使用哪种方言。如果我们指定数据源;我们不需要指定数据库的用户名、密码 url(因为所有这些都在数据源配置本身中指定)。

最重要的一点是您指定数据源的方式。它应该是完整的路径: java:/comp/env/jdbc/kids 。所有这一切,而我在 comp 之前错过了斜线。

<persistence-unit name="kids" transaction-type="RESOURCE_LOCAL">
    <non-jta-data-source>java:/comp/env/jdbc/kids</non-jta-data-source>
    <class>com.kids.domain.User</class>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
        <property name="connection.autocommit" value="false"/>
        <property name="hibernate.hbm2ddl.auto" value="create"/>
        <property name="hibernate.show_sql" value="true"/>
    </properties>
</persistence-unit>

于 2012-05-01T15:48:08.757 回答
1

也许尝试使用persistence.xml JNDI 定义的名称,包括命名空间(“ java:comp/env ”)以及JNDI 路径(“ jdbc/kids ”)在一个字符串中(即把它们放在一起)。

于 2012-04-19T18:11:34.510 回答