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
的内容无法从myTestFunctions.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项目
这些项目中的路径来自您的Eclipsepom.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