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:JNDI名を検索できません[jdbc / kids]

なぜそれが起こる可能性があるのか​​考えてみてください!

4

2 に答える 2

16

最後に、以下のプロパティを指定した後、今日は機能しました。データソースについて言及するだけでは不十分だからです。使用する方言など、いくつかのプロパティを指定する必要があります。データソースを指定した場合; データベースのユーザー名、パスワードURLを指定する必要はありません(すべてデータソース構成自体で指定されているため)。

最も重要なポイントは、データソースを指定する方法です。完全なパスである必要があります:java:/ comp / env / jdbc/kids。私がコンプの直前にスラッシュを逃していた間、これすべて。

<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

たぶん、名前空間( " java:comp / env ")とJNDIパス( " jdbc / kids ")の両方を単一の文字列に含む(つまり、それらをまとめた)persistence.xmlJNDI定義名を試してください。

于 2012-04-19T18:11:34.510 に答える