Java 没有名为persistence.xml的EntityManager的持久性提供程序

Java 没有名为persistence.xml的EntityManager的持久性提供程序,java,eclipse,hibernate,jpa,hyperjaxb,Java,Eclipse,Hibernate,Jpa,Hyperjaxb,这不是上面标签所说的重复。这个问题还没有得到回答。 我正在尝试设置以使hyperjaxb在eclipse项目中工作。如何让它查看持久性提供程序hbm2ddl尚未在数据库中创建表结构。这就是应用程序没有看到持久性提供程序的原因吗?或者是因为target/generated sources中的persistence.xml的内容无法从myTestFunctions.java试图调用它的src/main/java目录中访问?以下是具体情况。。。这行代码: entityManagerFactory =

这不是上面标签所说的重复。这个问题还没有得到回答。

我正在尝试设置以使
hyperjaxb
在eclipse项目中工作。如何让它查看持久性提供程序
hbm2ddl
尚未在数据库中创建表结构。这就是应用程序没有看到持久性提供程序的原因吗?或者是因为
target/generated sources
中的
persistence.xml
的内容无法从my
TestFunctions.java
试图调用它的
src/main/java
目录中访问?以下是具体情况。。。这行代码:

entityManagerFactory = Persistence.createEntityManagerFactory("persistence.xml", persistenceProperties);  
正在抛出此错误:

Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named persistence.xml
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
    at maintest.TestFunctions.setUpPersistence(TestFunctions.java:119)
    at maintest.Main.main(Main.java:10)
引发错误的代码在此方法中:

public void setUpPersistence(){
    final Properties persistenceProperties = new Properties();
    InputStream is = null;
    try {
        Class<? extends TestFunctions> c = getClass();
        ClassLoader cl = c.getClassLoader();
        is = cl.getResourceAsStream("persistence.properties");
        persistenceProperties.load(is);
    }catch (IOException i) {i.printStackTrace();}
    finally {if (is != null) {try {is.close();} catch (IOException ignored) {}}}
    entityManagerFactory = Persistence.createEntityManagerFactory("persistence.xml", persistenceProperties);
}  
public void setUpPersistence() throws ClassNotFoundException{
    final Properties persistenceProperties = new Properties();
    InputStream is = null;
    try {
        Class<? extends TestFunctions> c = getClass();
        ClassLoader cl = c.getClassLoader();
        is = cl.getResourceAsStream("persistence.properties");
        persistenceProperties.load(is);
    }catch (IOException i) {i.printStackTrace();}
    finally {if (is != null) {try {is.close();} catch (IOException ignored) {}}}//org.jvnet.hyperjaxb3.ejb.tests.po
    Class c = Class.forName("org.eclipse.persistence.jpa.PersistenceProvider");
    entityManagerFactory = Persistence.createEntityManagerFactory(/*"org.jvnet.hyperjaxb3.ejb.tests.po"*//*"persistence.xml"*/"org.jvnet.hyperjaxb3.ejb.tests.po", persistenceProperties);
}
persistence.properties
是:

hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.username=someusername
hibernate.connection.password=somepassword
hibernate.connection.url=jdbc:mysql://localhost/somedatabasename
hibernate.hbm2ddl.auto=create-drop
hibernate.cache.provider_class=org.hibernate.cache.HashtableCacheProvider
hibernate.jdbc.batch_size=0
eclipse项目的目录结构为:


**编辑:** 为了好玩,我将
META-INF
文件夹移动到与调用类相同的级别,但得到了相同的错误。下面是两个新的屏幕截图,显示仍然抛出错误的persistence.xml的位置:


第二次编辑: 我添加了
classc=Class.forName(“org.eclipse.persistence.jpa.PersistenceProvider”)位于
TestFunctions.java
的第116行,当我右键单击
Main.java
并执行
以..java应用程序运行时,会触发以下错误:

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence version="1.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd
http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:orm="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <persistence-unit name="org.jvnet.hyperjaxb3.ejb.tests.po">
            <class>org.jvnet.hyperjaxb3.ejb.tests.po.Items</class>
            <class>org.jvnet.hyperjaxb3.ejb.tests.po.Items$Item</class>
            <class>org.jvnet.hyperjaxb3.ejb.tests.po.PurchaseOrderType</class>
            <class>org.jvnet.hyperjaxb3.ejb.tests.po.USAddress</class>
        </persistence-unit>
    </persistence>
Exception in thread "main" java.lang.ClassNotFoundException: org.eclipse.persistence.jpa.PersistenceProvider
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:169)
    at maintest.TestFunctions.setUpPersistence(TestFunctions.java:116)
    at maintest.Main.main(Main.java:10)  
以下是新的
TestFunctions.setUpPersistence()
方法:

public void setUpPersistence(){
    final Properties persistenceProperties = new Properties();
    InputStream is = null;
    try {
        Class<? extends TestFunctions> c = getClass();
        ClassLoader cl = c.getClassLoader();
        is = cl.getResourceAsStream("persistence.properties");
        persistenceProperties.load(is);
    }catch (IOException i) {i.printStackTrace();}
    finally {if (is != null) {try {is.close();} catch (IOException ignored) {}}}
    entityManagerFactory = Persistence.createEntityManagerFactory("persistence.xml", persistenceProperties);
}  
public void setUpPersistence() throws ClassNotFoundException{
    final Properties persistenceProperties = new Properties();
    InputStream is = null;
    try {
        Class<? extends TestFunctions> c = getClass();
        ClassLoader cl = c.getClassLoader();
        is = cl.getResourceAsStream("persistence.properties");
        persistenceProperties.load(is);
    }catch (IOException i) {i.printStackTrace();}
    finally {if (is != null) {try {is.close();} catch (IOException ignored) {}}}//org.jvnet.hyperjaxb3.ejb.tests.po
    Class c = Class.forName("org.eclipse.persistence.jpa.PersistenceProvider");
    entityManagerFactory = Persistence.createEntityManagerFactory(/*"org.jvnet.hyperjaxb3.ejb.tests.po"*//*"persistence.xml"*/"org.jvnet.hyperjaxb3.ejb.tests.po", persistenceProperties);
}
public void setUpPersistence()引发ClassNotFoundException{
最终属性persistenceProperties=新属性();
InputStream=null;
试一试{

类应该传递的参数是持久化单元(而不是文件名)

对于您的持久性,应该是:

entityManagerFactory = Persistence.createEntityManagerFactory("org.jvnet.hyperjaxb3.ejb.tests.po", persistenceProperties);

您应该传递的参数是持久化单元(而不是文件名)

对于您的持久性,应该是:

entityManagerFactory = Persistence.createEntityManagerFactory("org.jvnet.hyperjaxb3.ejb.tests.po", persistenceProperties);

我无法抗拒,这是我最后一次尝试帮助你。:)我写这篇文章是为了你和任何可能遇到类似问题的用户

我相信您只是在Eclipse项目配置中遇到了问题。Eclipse项目中的路径似乎不正确

通常,当您使用
File>import…>将现有Maven项目导入Eclipse时,
m2eclipse
应该分析Maven项目的结构,并使用(
.classpath
.project
文件)自动创建Eclipse项目

这些项目中的路径来自您的Eclipse
pom.xml
。因此,您实际上不应该创建/修改/添加/删除/复制/移动/任何Eclipse源文件夹。如果您这样做,您的Eclipse项目将不再与Maven项目同步,您将得到非常奇怪的结果

有时候
m2eclipse
的工作做得不好。有时候你没有找到正确的源文件夹,东西丢失了等等。根据我的经验,这一点随着时间的推移变得非常好,而现在
m2eclipse
的工作非常有魅力。从我在你的斗争中看到的情况来看,你可能有一个较旧版本的
m2eclipse。也许不是,但我还是建议检查一下

接下来,有时
m2eclispe
仍会夹紧。在这种情况下,强烈建议执行以下操作:

  • 清理项目:
    project>Clean…
  • 更新Maven项目(Alt+F5)。确保从
    pom.xml

最后,您应该得到以下项目结构:

具体而言,您应该获得以下源文件夹:

  • src\main\java
    -主java文件的源文件夹
  • src\main\resources
    -资源的源文件夹
  • target\generated sources\xjc
    -生成代码的源文件夹。
    • 重要提示:不是像您那样的
      target\generated sources
      ,而是
      target\generated sources\xjc
    • 此文件夹包含生成的Java类。(Hyperjaxb向它们添加JPA注释)
    • 它还包含
      META-INF\persistence.xml
      ,这是一个持久性单元描述符。
      META-INF\persistence.xml
      资源由JPA规范指定。持久性单元将从这里加载
    • 如果您已经生成了一个往返测试(xml到db和返回),那么您还会在某处看到一个
      RoundtripTest
      类。这是一个JUnit测试类,应该可以直接执行它。(
      运行方式>JUnit测试
  • src\test\java
    -测试类
  • src\test\resources
    -测试资源
这是Maven项目的标准目录布局。唯一的特点是
target\generated sources\xjc
source文件夹,其中保存由模式编译器生成的代码。即使这是绝对标准的,Maven代码生成插件在
target\generated sources\som中生成代码也是一种常见的约定电子工具
目录

下面我发布了我的项目中的
.classpath
文件:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" output="target/classes" path="src/main/java">
        <attributes>
            <attribute name="optional" value="true"/>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry including="**/*.java" kind="src" output="target/classes" path="target/generated-sources/xjc">
        <attributes>
            <attribute name="optional" value="true"/>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="src" output="target/test-classes" path="src/test/java">
        <attributes>
            <attribute name="optional" value="true"/>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="output" path="target/classes"/>
</classpath>
这意味着实体管理器已正确启动,但无法连接到数据库。如果您已在
src\test\resources\persistence.properties
中正确配置了测试数据库,则应该能够连接到数据库。如果您将
po.xml
文件放入
src\test\samples
,则将执行往返测试将:

  • 解组此文件
  • 将其保存到数据库中
  • 把它装回去
  • 将其与原始结果进行比较
请先运行roundrip测试,然后再开始自己的实验。不要复制代码,不要修改
Plugin execution not covered by lifecycle configuration: org.codehaus.mojo:hibernate3-maven-plugin