【问题标题】:Database settings in persistence.xml not used未使用 persistence.xml 中的数据库设置
【发布时间】:2011-03-01 19:04:59
【问题描述】:

我是 JPA 的新手,为了自学,我正在设置一个小型 Web 应用程序并部署到 Glassfish 3.1。

当我在 persistence.xml 中引用 JNDI 数据源时,JPA 可以正常工作,例如:

<?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 似乎只是被忽略了,而是使用了默认的容器管理的 DataSource,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>

在我无数次尝试和重试期间积累的那些文件中可能有一些无关紧要的东西。

我在这里错过了什么?

【问题讨论】:

    标签: jpa eclipselink glassfish-3


    【解决方案1】:

    您不能将手动配置的数据源与 transaction-type="JTA" 一起使用。

    JPA 规范说:

    JTA 的交易类型 假定将提供 JTA 数据源——由 jta-data-source 元素指定 或由容器提供。

    尝试改用transaction-type="RESOURCE_LOCAL"(虽然我不确定它如何与容器管理的事务一起使用,如果你使用它们)。

    【讨论】:

    • 我试过了,但你是对的;这给出了错误“只有具有事务类型 JTA 的持久性单元可以用作容器管理的实体管理器。”当我尝试部署时。在什么情况下我可以使用 RESOURCE_LOCAL 并仍然部署?
    • @Coder:据我了解,您不能在没有 JTA 数据源的情况下使用约束器管理的事务。也就是说,使用手动配置的数据源需要您手动管理事务(在通过Persistence.createEntitiyManagerFactory() 获得的持久性上下文上)。它看起来像是 EJB 的另一种不灵活性。
    • @Coder Doe:如果您使用容器管理的事务,您别无选择,只能使用 JTA 数据源。我认为这不会很快改变!直接支持JTA的服务器有:Glassfish、JBoss、Websphere。非 JTA 服务器:Tomcat。
    猜你喜欢
    • 2019-07-11
    • 2023-03-17
    • 2015-01-08
    • 2013-10-30
    • 1970-01-01
    • 2017-11-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多