【问题标题】:JPA with EJB: No persistence provider带有 EJB 的 JPA:没有持久性提供程序
【发布时间】:2013-05-06 17:53:12
【问题描述】:

我正在尝试使用 JPA 运行我的第一个应用程序,但问题似乎是没有找到 persistence.xml。

run:
 [java] Driver loaded successfull.
 [java] Got connection.
 [java] Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named books
 [java]     at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:84)
 [java]     at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
 [java]     at com.primaryAnalysis.Main.main(Unknown Source)
 [java] Java Result: 1

项目结构相同:

源代码 ├── java │   └── com │   ├── ejb │   │   └── 坚持 │   │   └── ejb3-persistence.jar │   ├── mysql │   │   └── jdbc │   │   └── 司机 │   │   └── mysql-connector-java-5.1.24-bin.jar │   └── 初级分析 │   ├── ... └── 资源 └── META-INF └──persistence.xml

这是我的 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="books" transaction-type="JTA">
            <provider>com.ejb.Persistence</provider>
            <class>com.primaryAnalysis.Book</class>
            <class>com.primaryAnalysis.Autor</class>
            <properties>
                    <property name="javax.persistence.jdbc.driver"   value="com.mysql.jdbc.Driver" />
                    <property name="javax.persistence.jdbc.url"      value="jdbc:mysql://localhost/books" />
                    <property name="javax.persistence.jdbc.user"     value="root" />
                    <property name="javax.persistence.jdbc.password" value="MyNewPass" />
                    <property name="toplink.ddl-generation"          value="create-tables" />
            </properties>
    </persistence-unit>
 </persistence>   

我的 build.xml 中的 taskdef 资源 中有 resource 目录的路径。

有什么想法吗?

谢谢。

【问题讨论】:

  • 我不认为META-INF 应该在src/resources 之下。它应该在您项目的根目录中。
  • @SotiriosDelimanolis:在一个 Maven 项目中,在 /resources 下绝对没有问题。
  • @Sotirios Delimanolis 我尝试将 META-INF 放在项目的根目录中,但仍然没有用。
  • @mortalland 你能告诉我你生成的 jar 在内部是什么样子吗?
  • @SotiriosDelimanolis:它有 META-INF 目录,里面有一个清单文件和 com 目录。它似乎应该在 META-INF 中有 persistence.xml。我说的对吗?

标签: java jpa


【解决方案1】:

根据this documentationpersistence.xml 文件应该在你的项目jar 的META-INF 文件夹中。当您在 IDE 项目结构中进行开发时,它在哪里并不重要,但您的构建工具应该将它放在 jar 中的 META-INF 下。

用蚂蚁(build.xml)

<copy todir="some_folder/temp">
    <fileset dir="src/resources" /> // copies everything under src/resources to some_folder/temp
</copy>

<jar jarfile="some_folder/bin/your_app.jar">
    <fileset dir="some_folder/temp" /> // put the folder from before in your jar
</jar>

【讨论】:

    【解决方案2】:
    <provider>com.ejb.Persistence</provider>
    

    什么?

    Google 搜索测试 (Google: "com.ejb.Persistence") 表明这是非常特别的(罕见):

    16 results
    

    结果是:

    1. <provider>com.ejb.Persistence</provider> - this question
    2. <local>com.ejb.persistence.UserLocal</local> - some samples from india's guest at oracle forum
    3. no exact match
    4 - 9. search spam sites webwiki.com codeweblog.com ineedfile2.com webstatsdomain.com
    10 - 16. "java-enterprise-app.developerfaqs.com.ejb.finder" at ejb.developerfaqs.com/
    

    所以我几乎可以确定您在文件夹“src/java/com/ejb/persistence/”中没有名为“com.ejb.Persistence”的有效提供程序(注意,这是 com.ejb.Persistence 的错误文件夹类,它应该被缝合为“com/ejb/Persistence.class”)或jar文件ejb3-persistence.jar。我有一份来自mvnrepository.com 的文件副本,根据这个 jar 的结构,它只有 javax.persistence.* 类,没有任何 com.ejb.* 类。

    我认为您可以切换到 eclipselink jpa 提供程序(从 http://www.eclipse.org/eclipselink/downloads/ 下载“Installer Zip (37 MB)”并从“eclipselink/jlib/eclipselink.jar”中提取组合 jar):

      <persistence-unit name="books" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
         <class>com.primaryAnalysis.Book</class>
         <class>com.primaryAnalysis.Autor</class>
        <properties>
          <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
          <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/books"/>
          <property name="javax.persistence.jdbc.password" value="MyNewPass"/>
          <property name="javax.persistence.jdbc.user" value="root"/>
          <property name="eclipselink.ddl-generation" value="create-tables"/>
        </properties>
      </persistence-unit>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 2018-04-03
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      • 2014-12-07
      相关资源
      最近更新 更多