OpenJpa и JNDI

Как для OpenJPA указать соединение JNDI в jta_datasource без указания имени пользователя и пароля в файле persistence.xml? Это дает мне ошибку, когда имя пользователя и пароль не указаны в файле persistence.xml для jndi.


person JEE_program    schedule 18.11.2012    source источник


Ответы (3)


Попробуйте использовать элемент jta-data-source в файле persistence.xml.

<jta-data-source>java:comp/env/jdbc/FooBarDataSourceJNDI</jta-data-source>
person Rick    schedule 19.11.2012

Отличный вопрос; это не очень хорошо описано в документации OpenJPA. Что вам нужно сделать, так это использовать специальный синтаксис "java:comp/env/..." для свойства "openjpa.ConnectionFactoryName", чтобы попросить OpenJPA получить параметры соединения из JNDI. Например, ваш файл persistence.xml должен выглядеть примерно так:

<?xml version="1.0"?>
<persistence>
  <persistence-unit name="openjpa">
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
    <class>tutorial.Animal</class>
    <class>tutorial.Dog</class>
    <class>tutorial.Rabbit</class>
    <class>tutorial.Snake</class>
    <properties>
      <property name="openjpa.ConnectionFactoryName" value="java:comp/env/jdbc/myjndi"/>
      <property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO"/>
    </properties>
  </persistence-unit>
</persistence>

Это запросит ресурс jndi с именем «myjndi» из контейнера. Если вы используете Tomcat, у вас будет context.xml, который выглядит примерно так:

<?xml version='1.0' encoding='UTF-8'?>
<Context>
    <Resource name="jdbc/myjndi"
        auth="Container"
        scope="Shareable"
        type="javax.sql.DataSource"
        maxActive="100"
        maxIdle="30"
        maxWait="10000"
        removeAbandoned="true"
        username="username"
        password="password"
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/DBNAME?characterEncoding=UTF-8"
        />
</Context>

Измените указанные выше параметры JNDI в соответствии с требованиями вашей базы данных.

person Templar    schedule 18.11.2012
comment
Спасибо Тамплиер. К сожалению, это не решило проблему. Я использую openjpa на веб-сфере ibm, мое jndiname — A/B. Теперь я использую ‹properties› ‹property name=openjpa.ConnectionFactoryName value=java:comp/env/A/B/› ‹/properties› Я получаю следующее исключение: JDBC Driver или имя класса DataSource должно быть указано в ConnectionDriverName имущество. - person JEE_program; 19.11.2012
comment
когда я указываю свойство ConnectionDriverName, оно выдает исключение для имени пользователя и пароля - person JEE_program; 19.11.2012

У меня сработала конфигурация через код:

Map<String, String> conf = new HashMap<>();
conf.put("javax.persistence.jtaDataSource", "java:comp/env/jdbc/myjndi");
return getEntityManagerFactory().createEntityManager(conf);

Я думаю, что еще не помещаю persistence.xml в нужное место.

person andy    schedule 02.02.2017
comment
это было написано с ошибкой. Теперь это тоже работает: <properties> <property name="javax.persistence.jtaDataSource" value="java:comp/env/jdbc/myjndi"/> </properties> - person andy; 03.02.2017