2017-02-18 61 views
0

我正在尝试编写使用JPA访问数据库的Java EE应用程序。到目前为止,我只是使用了@Entity批注并将其他所有内容都置于默认状态(例如,persistence.xml文件使用_TimerPool作为jta-data-source,而我没有创建任何db)。在Glassfish中创建Derby数据库并连接到Java EE应用程序

所以我想尝试使用一个实际的数据库。我进入了服务屏幕,JavaBD>创建新数据库,使用名称和密码进行设置。

数据库的网址为:jdbc:德比://本地主机:1527/PROVA

然后,我通过GlassFish的向导创建我的应用程序的persistence.xml文件:

<persistence-unit name="JobsPU" transaction-type="JTA"> 
    <jta-data-source>java:app/Prova</jta-data-source> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties> 
     <property name="javax.persistence.schema-generation.database.action" value="create"/> 
     <property name="javax.persistence.schema-generation.database.target" value="database-and-scripts"/> 
     <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/> 
     <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/Prova"/> 
     <property name="javax.persistence.jdbc.user" value="paolo"/> 
     <property name="javax.persistence.jdbc.password" value="paolo"/> 
    </properties> 
    </persistence-unit> 

当我尝试部署我得到这个异常:

Grave: Exception while preparing the app : Invalid resource : { ResourceInfo : (jndiName=java:app/Prova__pm), (applicationName=Jobs) } 
com.sun.appserv.connectors.internal.api.ConnectorRuntimeException: Invalid resource : { ResourceInfo : (jndiName=java:app/Prova__pm), (applicationName=Jobs) } 

似乎与JNDI命名有关。我真的不知道,我仍然在努力学习。如果我转到Glassfish的控制台,在JNDI列表中,我看不到任何似乎与我的数据库相关的东西(不在JDBC连接池或JDBC资源中)。我该怎么办?

非常感谢您的帮助。

+0

这样做有帮助吗? http://stackoverflow.com/questions/13407505/java-jpa-glassfish-invalid-resource-jdbc-default-pm –

+0

最新版本的Glassfish被破解,当你尝试点击新的“jdbc资源”时,你会得到一个很好的例外。那很棒。 – Paul

+0

你有没有考虑使用payara或wildfly? –

回答

0

要为EE容器配置PersistenceUnit,您必须使用jta-data-sourcetransaction-type="JTA"。对于jta-data-source,您必须指定必须在EE容器(您的案例中为glassfish服务器)中配置的JDBC连接池的JNDI名称。有教程How to set up a JDBC Connection Pool on Glassfish。像

<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/> 
     <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/Prova"/> 
     <property name="javax.persistence.jdbc.user" value="paolo"/> 
     <property name="javax.persistence.jdbc.password" value="paolo"/> 

在这种情况下PersistenceUnit属性将用于EE容器被忽略(见this documentation)。 要使用此属性,可以为SE环境配置PersistenceUnit。在此之前,我建议您阅读文章differences between RESOURCE_LOCAL and JTA persistence contexts。 SE应用程序的配置将如下所示:

<persistence-unit name="default" transaction-type="RESOURCE_LOCAL"> 
    <provider> 
     org.eclipse.persistence.jpa.PersistenceProvider 
    </provider> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties> 
     <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/> 
     <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/Prova"/> 
     <property name="javax.persistence.jdbc.user" value="paolo"/> 
     <property name="javax.persistence.jdbc.password" value="paolo"/> 
    </properties> 
</persistence-unit> 
相关问题