我正在尝试编写一个使用JPA访问数据库的Java EE应用程序。到目前为止,我只使用@Entity注释并将其他所有内容保留为默认状态(例如,persistence.xml文件使用_TimerPool作为jta-data-source,而我没有创建任何数据库)。
所以我想尝试使用实际的数据库。我进入了服务界面,JavaBD>创建新数据库,使用名称和密码进行设置。
DB&#39> url:jdbc:derby:// localhost: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 :(得分:0)
要为EE容器配置PersistenceUnit,您必须使用jta-data-source
和transaction-type="JTA"
。对于jta-data-source
,您必须指定必须在EE容器(在您的情况下为glassfish服务器)中配置的JDBC ConnectionPool的JNDI名称。有教程How to set up a JDBC Connection Pool on Glassfish。同样在这种情况下PersistenceUnit属性如
<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"/>
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>