Настройки базы данных в файле persistence.xml не используются - PullRequest
0 голосов
/ 01 марта 2011

Я новичок в JPA, и чтобы попытаться научить себя, я настраиваю крошечное веб-приложение и развертываю его на Glassfish 3.1.

JPA отлично работает, когда я постоянно обращаюсь к источнику данных JNDI.xml, например:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
             version="1.0">
    <persistence-unit name="foo" transaction-type="JTA">
        <jta-data-source>jdbc/foo</jta-data-source>
        <class>my.app.Foo</class>
    </persistence-unit>
</persistence>

Но, насколько я понимаю, предполагается, что все параметры подключения к моей базе данных можно поместить в свойства в файле persistence.xml.Это может не быть хорошей практикой, но кажется, что это может быть удобно, когда я просто экспериментирую, и, возможно, во время модульного тестирования.

Однако, когда я следую примерам, которые я нашел для этого, persistence.xmlкажется, просто игнорируется и вместо стандартного источника данных, управляемого контейнером, используется jndi / __ default.Это экземпляр Derby, который не запущен.

Я пробовал этот файл для эфемерного экземпляра Derby в памяти:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">
    <persistence-unit name="foo" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>my.app.Foo</class>
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:derby:memory:NxtMv;create=true"/>
            <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
            <property name="javax.persistence.jdbc.user" value=""/>
            <property name="javax.persistence.jdbc.password" value=""/>
            <property name="eclipselink.ddl-generation" value="create-tables"/>
            <property name="eclipselink.ddl-generation.output-mode" value="database" />
            <property name="eclipselink.logging.level" value="INFO"/>
        </properties>
    </persistence-unit>
</persistence>

Я также пробовал это для сервера PostgreSQL (который работает при доступе через JNDI):

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">
    <persistence-unit name="foo" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>my.app.Foo</class>
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/foo"/>
            <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
            <property name="javax.persistence.jdbc.user" value="myuser"/>
            <property name="javax.persistence.jdbc.password" value="secret"/>
            <property name="eclipselink.ddl-generation" value="create-tables"/>
            <property name="eclipselink.ddl-generation.output-mode" value="database" />
            <property name="eclipselink.logging.level" value="INFO"/>
        </properties>
    </persistence-unit>
</persistence>

Возможно, в этих файлах есть какая-то не относящаяся к делу разница, которая накопилась во время моих бесчисленных попыток и попыток.

Что мне здесь не хватает?

1 Ответ

1 голос
/ 01 марта 2011

Нельзя использовать настроенный вручную источник данных с transaction-type="JTA".

JPA Spec говорит:

Тип транзакции JTA предполагает, что будет предоставлен источник данных JTA - либо как указано в элементе jta-data-source или предоставляется контейнером.

Попробуйте вместо этого использовать transaction-type="RESOURCE_LOCAL" (хотя я не уверен, как это будет работать с транзакциями, управляемыми контейнером, если вы их используете).

...