Java 没有名为X的EntityManager的持久性提供程序
我正在使用JPA开发一个JavaSE应用程序。不幸的是,我在调用后得到Java 没有名为X的EntityManager的持久性提供程序,java,jakarta-ee,jpa,entitymanager,persistence.xml,Java,Jakarta Ee,Jpa,Entitymanager,Persistence.xml,我正在使用JPA开发一个JavaSE应用程序。不幸的是,我在调用后得到null: Persistence.createEntityManagerFactory(Persistence\u UNIT\u NAME) 您将在下面找到: 调用EntityManagerFactory并意外返回null 我的persistence.xml文件 我的项目结构 我的代码片段: public class Main { private static final String PERSISTENCE_U
null
:
Persistence.createEntityManagerFactory(Persistence\u UNIT\u NAME)代码>
您将在下面找到:
- 调用
EntityManagerFactory
并意外返回null
- 我的
persistence.xml
文件
- 我的项目结构
我的代码片段:
public class Main {
private static final String PERSISTENCE_UNIT_NAME = "MeineJpaPU";
private static EntityManagerFactory factory;
public static void main(String[] args) {
// I get null on this line!!!
factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
EntityManager em = factory.createEntityManager();
// do stuff with entity manager
...
}
}
<?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="MeineJpaPU" transaction-type="RESOURCE_LOCAL">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<class>path.to.package.server.Todo</class>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/test"/>
<property name="javax.persistence.jdbc.user" value="postgres"/>
<property name="javax.persistence.jdbc.password" value="postgres"/>
</properties>
</persistence-unit>
</persistence>
My persistence.xml:
public class Main {
private static final String PERSISTENCE_UNIT_NAME = "MeineJpaPU";
private static EntityManagerFactory factory;
public static void main(String[] args) {
// I get null on this line!!!
factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
EntityManager em = factory.createEntityManager();
// do stuff with entity manager
...
}
}
<?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="MeineJpaPU" transaction-type="RESOURCE_LOCAL">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<class>path.to.package.server.Todo</class>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/test"/>
<property name="javax.persistence.jdbc.user" value="postgres"/>
<property name="javax.persistence.jdbc.password" value="postgres"/>
</properties>
</persistence-unit>
</persistence>
org.apache.openjpa.persistence.PersistenceProviderImpl
path.to.package.server.Todo
假的
我的项目结构:
public class Main {
private static final String PERSISTENCE_UNIT_NAME = "MeineJpaPU";
private static EntityManagerFactory factory;
public static void main(String[] args) {
// I get null on this line!!!
factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
EntityManager em = factory.createEntityManager();
// do stuff with entity manager
...
}
}
<?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="MeineJpaPU" transaction-type="RESOURCE_LOCAL">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<class>path.to.package.server.Todo</class>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/test"/>
<property name="javax.persistence.jdbc.user" value="postgres"/>
<property name="javax.persistence.jdbc.password" value="postgres"/>
</properties>
</persistence-unit>
</persistence>
必须将persistence.xml
文件移动到适当的位置
更具体地说,将META-INF/persistence.xml
文件添加到源文件夹的根目录中
在本例中,以下是适当的位置:src\main\java\META-INF\persistence.xml
详情如下:
(摘自JPA规范)
persistence.xml文件定义了一个持久性单元。persistence.xml文件
文件位于文件根目录的META-INF目录中
持久性单位
持久化单元的根是这里的键
如果您是非Java EE应用程序
META-INF目录中包含
persistence.xml文件称为持久性单元的根
如果您使用的是Java EE应用程序,则以下内容有效
在JavaEE环境中,持久化单元的根必须是
以下是:
- EJB-JAR文件
- WAR文件的WEB-INF/classes目录[80]
- WAR文件的WEB-INF/lib目录中的jar文件
- EAR库目录中的jar文件
- 应用程序客户机jar文件
快速建议:
- 检查persistence.xml是否在类路径中
- 检查hibernate提供程序是否在类路径中
在独立应用程序(JavaEE之外)中使用JPA时,需要在某个地方指定持久性提供程序。据我所知,这可以通过两种方式实现:
- 将provider元素添加到持久化单元:
org.hibernate.ejb.HibernatePersistence
(如Chris在此处的正确答案中所述:)
- 必须将接口javax.persistence.spi.PersistenceProvider指定为服务,请参见此处:(在类路径中包含hibernate或其他JPA实现时,通常会包含此选项
在我的例子中,我发现由于maven的错误配置,hibernate entitymanager.jar没有作为依赖项包含,即使它是其他模块的暂时依赖项
请参见此处的答案:因此,在我的例子中,所有内容都在类路径中,但我必须添加
Class c=Class.forName(“org.eclipse.persistence.jpa.PersistenceProvider”)
我认为这导致PersistenceProvider在javax类中注册了自己。我过去也曾为JDBC驱动程序做过类似的事情。如果您不想移动META-INF文件夹(可能是因为您的IDE在那里创建了它,您不想混淆它),如果您使用的是Maven,则可以使用
标记告诉Maven在何处查找META-INF。请参阅:
就你而言:
<build>
<resources>
<resource>
<directory>src</directory>
</resource>
</resources>
</build>
src
我最近将NB 8.1升级到了8.2,突然遇到了这个问题,花了2天时间绞尽脑汁解决了这个问题。到了8.1,删除processorpath(其他人提到过)起到了作用。有了8.2,问题依然存在
最后,我发现eclipselink的默认库(JPA 2.1)中缺少eclipselink.jar。我将该文件添加到库的定义中,瞧,它开始工作了!不要明确给出JPA依赖关系
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0.2</version>
</dependency>
javax.persistence
持久性api
1.0.2
谢谢,
Rahulhibernate-entitymanager.jar对我来说也是正确的答案。实际上,你让我从长达一周的长篇大论中解脱出来,我一直在努力弄清楚这个xml的东西