7

概述:这是我的第一篇由 Websphere 7 Server & JPA 1.0 & EJB & Derby Database 编写的教程。

首先:我的数据源名称是 EJB3BANK,我的目标数据库是 SHOP。

第二:这是persistence.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
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">
<persistence-unit name="ShopJPA" transaction-type="JTA">
    <jta-data-source>jdbc/EJB3BANK</jta-data-source>
    <non-jta-data-source>jdbc/EJB3BANK</non-jta-data-source>
    <properties>
        <property name="openjpa.jdbc.Schema" value="SHOP" />
    </properties>
</persistence-unit>
</persistence> 

第三: Item实体类的部分代码

@Entity
@Table(schema = "SHOP", name = "ITEM")
@NamedQuery(name = "getItem", query = "SELECT i FROM Item i")
public class Item{...}

第四:这里是业务类CartBean这里是问题的开始

@Stateful
CartBean implements Cart{
....
....
public List<Item> getItems() {      
javax.persistence.Query query = em.createNamedQuery("getItem");//the problem here
return query.getResultList();
}
}

这是错误消息:必须在 ConnectionDriverName 属性中指定 JDBC 驱动程序或数据源类名称。如何解决这个问题?

4

7 回答 7

10

如果您通过 JNDI 名称引用数据源,则不需要使用 openjpa.ConnectionDriverName 属性。

此问题的一个可能原因是persistence.xml 位于错误的位置。该文件必须位于 [类上下文的根目录]/META-INF。对于 .war 文件,内容应类似于:

(foo.war)
WEB-INF/classes/META-INF/persistence.xml
WEB-INF/classes/com/foo123/jpa/Project.class
WEB-INF/web.xml
index.jsp

对于打包在 .war 文件中的库 .jar 文件:

(foo.war)
WEB-INF/lib/my-library.jar
WEB-INF/web.xml
index.jsp

(my-library.jar)
META-INF/persistence.xml
com/foo123/jpa/Project.class
于 2011-10-12T19:35:57.663 回答
3

jpa 消息

必须在 ConnectionDriverName 属性中指定 JDBC 驱动程序或 DataSource 类名

是一个误导性的信息。无助于理解问题。最好是这样的:

jta-data-source 是 jdbc/EJB3BANK 不可用/无法访问

因为这是正在发生的事情。也许您已经在 web 或 ejb 项目中包含了 jpa 项目(或者可能没有,您可以将 jpa 方面直接添加到此类项目之一)但是,一旦您在 webshpere 控制台上创建了 jdbc 连接,这是最好的方法使用它是:

  1. 更改您的 persistence.xml (AnyJpaProject/src/META-INF/persistence.xml)

    <jta-data-source>java:comp/env/jdbc/EJB3BANK</jta-data-source>
    
  2. 确保您的 web.xml/ejb-jar.xml 具有以下内容:

    <resource-ref>
        <description></description>
        <res-ref-name>jdbc/EJB3BANK</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref> 
    
  3. 添加 ibm-ejb-jar-bnd.xml/ibm-web-bnd.xml:

<resource-ref name="jdbc/EJB3BAN" binding-name="jdbc/EJB3BAN">

希望这有帮助。

于 2016-04-19T09:48:33.340 回答
2

我认为这是 JPA 提供程序实现的一个错误。我遇到了类似的错误,但在我的情况下,我实际上没有输入数据源名称。原因是标准允许默认数据源的概念。不幸的是,它不适用于 WebSphere Application Server 8.0.0.1 或 RSA 8.0。也不确定是否已提交 PMR。

于 2011-11-10T05:53:16.727 回答
1

只是添加到eis的答案(抱歉,没有足够的代表发表评论):

使用 Eclipse,我的 persistence.xml 最初位于根 src 文件夹 src/persistence.xml

将其移至 src/META-INF/persistence.xml 解决了我的问题,因为 Eclipse 现在自动将其移至构建目录。

并不是所有的 ORM(对象关系映射)API 都像这样工作,我很确定使用 Hibernate 我的 hibernate.cfg.xml(persistence.xml)总是直接在“src”文件夹中。

于 2013-06-30T21:46:33.873 回答
1

在应用服务器中添加数据源后无法使用persistence.xml中的数据源名称是一个bug。但是,如果您在 persistence.xml 中添加如下属性,它将起作用。

    <property name="openjpa.ConnectionURL" value="DB URL"/>
    <property name="openjpa.ConnectionDriverName" value="Driver Name"/>
    <property name="openjpa.ConnectionUserName" value="userid"/>
    <property name="openjpa.ConnectionPassword" value="password"/>
于 2016-01-22T19:25:01.400 回答
0

我认为,您要做的是通过在 persistence.xml 中声明一个新的数据源来定义一个新的数据源,并且它缺少像这样的属性<property name="openjpa.ConnectionDriverName" value="org.apache.derby.jdbc.EmbeddedDriver" />

但是,当您使用 Websphere 时,我建议您通过 Webspheres 管理控制台(Web 界面)创建数据源。在Resources->JDBC下,您将首先创建一个JDBC Provider并告诉它使用 Derby Driver。之后,您将使用此提供程序创建一个新的数据源。在那里您可以定义 JNDI 绑定。将其设置为jdbc/EJB3BANK。而且您当前的 persistence.xml 应该可以正常工作。

于 2011-06-17T08:39:15.817 回答
0

试试这个男人:

 <persistence-unit name="ShopJPA" transaction-type="JTA">
     <jta-data-source>jdbc/EJB3BANK</jta-data-source>
     <non-jta-data-source>jdbc/EJB3BANK</non-jta-data-source>
     <class>jdbc/EJB3BANK</class>
     <properties>
         <property name="openjpa.jdbc.Schema" value="SHOP" />
     </properties>
 </persistence-unit>
 </persistence> 

我不知道节点类中是否必须是“jdbc/EJB3BANK”还是只有“EJB3BANK”,试试这两个选项。=D 它适用于我

于 2014-08-18T23:25:36.617 回答