Jpa 未使用persistence.xml中的数据库设置

Jpa 未使用persistence.xml中的数据库设置,jpa,eclipselink,glassfish-3,Jpa,Eclipselink,Glassfish 3,我是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/XMLS

我是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>

jdbc/foo
my.app.Foo
但据我所知,应该可以将所有数据库连接设置放入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>

org.eclipse.persistence.jpa.PersistenceProvider
my.app.Foo
我也在PostgreSQL服务器上尝试过这一点(通过JNDI访问时可以工作):


org.eclipse.persistence.jpa.PersistenceProvider
my.app.Foo
在我无数次的尝试和尝试中积累的那些文件中可能有一些不相关的瑕疵


我在这里缺少什么?

您不能将手动配置的数据源与
事务类型=“JTA”
一起使用

JPA规格说明:

JTA的事务类型 假设将按照JTA数据源元素的指定提供JTA数据源 或由容器提供


尝试改用
transaction type=“RESOURCE\u LOCAL”
(尽管我不确定如果您使用容器管理的事务,它将如何工作)。

我已经尝试过,但您是对的;当我尝试部署时,会出现错误“只有事务类型为JTA的持久化单元可以用作容器管理的实体管理器”。在什么情况下我可以使用RESOURCE_LOCAL并仍然部署?@Coder:据我所知,没有JTA数据源,您无法使用contrainer管理的事务。也就是说,使用手动配置的数据源需要手动管理事务(在通过
persistence.createEntityManagerFactory()获取的持久化上下文上)。看起来EJB还有一个不灵活的地方。@Coder Doe:如果您使用的是容器管理的事务,那么您别无选择,只能使用JTA数据源。我认为这不会很快改变!直接支持JTA的服务器有:Glassfish、JBoss和Websphere。非JTA服务器:Tomcat。
<?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>