没有命名为 EntityManager 的持久性提供程序

我使用 META-INF目录下的 TopLink创建了同名的 persistence.xml。 然后,我用下面的代码调用它:

EntityManagerFactory emfdb = Persistence.createEntityManagerFactory("agisdb");

然而,我得到了以下错误消息:

2009-07-21 09:22:41,018 [main] ERROR - No Persistence provider for EntityManager named agisdb
javax.persistence.PersistenceException: No Persistence provider for EntityManager named agisdb
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:89)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60)

以下是 persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
<persistence-unit name="agisdb">
<class>com.agis.livedb.domain.AddressEntity</class>
<class>com.agis.livedb.domain.TrafficCameraEntity</class>
<class>com.agis.livedb.domain.TrafficPhotoEntity</class>
<class>com.agis.livedb.domain.TrafficReportEntity</class>
<properties>
<property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/agisdb"/>
<property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="toplink.jdbc.user" value="root"/>
<property name="toplink.jdbc.password" value="password"/>
</properties>
</persistence-unit>
</persistence>

它应该在类路径中,但是,我得到了上面的错误。

440851 次浏览

<persistence-unit name="agisdb">之后,定义持久性提供程序名称:

<provider>org.hibernate.ejb.HibernatePersistence</provider>

确保 persistence.xml文件在目录 <webroot>/WEB-INF/classes/META-INF

也许您定义了一个类似 <provider>org.hibernate.ejb.HibernatePersistence</provider>的提供程序,但是在 jar 中引用了另一个提供程序。这种情况在我身上发生过: 我使用 openjpa 提供的  件,但是我在类路径中使用 eclipselink。 希望这有帮助!

角落案例: 如果您正在使用 m2Eclipse,它会自动在资源文件夹中放入排除符。然后,当您尝试在 eclipse 内部运行测试时,后续的尾声(没有尾声)将产生这个错误。

当实体管理器试图指向许多持久性单元时,就会发生这种情况:

  1. 在编辑器中打开相关文件(假设项目已在 IDE 中关闭)
  2. 删除所有与持久性和实体管理器相关的代码
  3. 保存文件
  4. 在 IDE 中打开项目
  5. 现在绑定您选择的 db 或表

"hibernate-entitymanager.jar"放在应用程序的类路径中。
对于较新的版本,应该使用 "hibernate-core.jar"而不是不推荐的 hibernate-entitymanager

如果您正在运行某些 IDE,如 日食: Project Properties -> Java Build Path -> Libraries.

否则将它放在应用程序的 /lib中。

这个问题已经得到了回答,但只是想发布一个提示,这使我停滞不前。此异常是在以前的错误之后引发的。我听到了这个:

property toplink.platform.class.name is deprecated, property toplink.target-database should be used instead.

尽管我已经修改了尾端的尾端,使其包含了新的属性名:

<property name="toplink.target-database" value="oracle.toplink.platform.database.oracle.Oracle10Platform"/>

在关于不推荐的属性名的消息之后,我得到了与上面一样的 PersisenceException 和其他一系列异常。我的建议: 一定要检查异常香肠的开头。

Glassfish v2.1.1中似乎存在一个 bug,其中重新部署或取消部署和部署没有更新被缓存到某个地方的 durence.xml。我不得不重启服务器,然后它工作了。

还有另一点: 如果您在 Eclipse RCP 环境中面临这个问题,您可能必须将 Factory 生成从 Persistence.createEntityManagerFactory更改为 new PersistenceProvider().createEntityManagerFactory

详细讨论请参阅 ECF

确保您已经在‘ src’文件夹下创建了尾随文件。我创建的项目文件夹下,这是我的问题。

在 OSGi 上下文中,有必要在包的 MANIFEST.MF 中列出您的持久化单元,例如。

JPA-PersistenceUnits: my-persistence-unit

否则,JPA-bundle 将不知道您的 bundle 包含持久性单元。

参见 http://wiki.eclipse.org/EclipseLink/Examples/OSGi/Developing_with_EclipseLink_OSGi_in_PDE

在类路径中需要以下 jar 文件:

  1. Antlr-2.7.6. jar
  2. Commons-Collection-3.1. jar
  3. Dom4j-1.6.1. jar
  4. Hibernate-commons-annotions-4.0.1. Final.jar
  5. Hibernate-core-4.0.1. Final.jar
  6. Hibernate-entitymanager. jar
  7. Hibernate-jpa-2.0-api-1.0.0. Final.jar
  8. Javhelp-3.9.0. jar
  9. Jboss-log-3.1.1.GA.jar
  10. Jta-1.1. jar
  11. Slf4j-api-1.5.8. jar
  12. Xxx-jdbc-Driver. jar

如果使用 Eclipse,请确保排除模式不会从构建路径上的源文件夹中删除 persistence.xml

  1. 转到 属性-> JavaBuild 路径-> 源代码标签
  2. 检查位于 < br > MyProject/src/main/java -> Excluded: <your_pattern> < br > tree 节点的排除模式
  3. 或者,通过选择节点并单击左侧的 编辑..。按钮将其设置为 Excluded: (None)

我在 pom.xml 文件中需要这样做:

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.2.6.Final</version>
</dependency>

快速建议:

  • 检查函数是否在类路径中
  • 检查休眠提供程序是否在您的类路径中

在绿色软体(在 JavaEE 之外)使用 JPA 时,需要在某个地方指定一个持久性提供程序。据我所知,有两种方法可以做到这一点:

在我的例子中,我发现由于 maven 的错误配置,hibernate-entitymanager jar 没有作为一个依赖项包含在内,即使它是其他模块的一个临时依赖项。

我遇到了同样的问题,但是在 EclipseLink 版本2.5.0上。

我通过添加另一个 jar 文件(持久性 _ 2.1.0.v201304241213.jar. jar)解决了这个问题;

需要罐子:
- javax.尾随 _ 2.1.0. v201304241213.jar
遮掩
- jdbc.jar (取决于使用的数据库) . < br >

希望这个能帮上忙。

我也有这个错误,但问题是 persistence.xml中的名称空间 uri。

我将 http://xmlns.jcp.org/xml/ns/persistence替换为 http://java.sun.com/xml/ns/persistence,将版本2.1替换为2.0。

现在起作用了。

您需要在类路径中添加 hibernate-entitymanager-x.jar。

在 Hibernate 4.x 中,如果存在 jar,那么就不需要将 org.Hibernate.ejb. HibernatePerst 添加到恒久化.xml 文件中。

我只是将 META-INF 复制到 src 并工作!

如果在 Persistence.createEntityManagerFactory("JPAService")中不同的类中有不同的名称,那么就会得到错误。通过重构,可以得到不同的名称就在我的箱子里。在 private void initComponents()中自动生成的 Persistence.createEntityManagerFactory("JPAService")类中,ContactsTable 类不同于 DBManager 类中的 Persistence.createEntityManagerFactory("JPAServiceExtended")

休眠5.2.5
类路径中所需的 Jar 文件。这在 Hibernate 5.2.5最终版本的必需文件夹中。它可以从一个 href = “ http://hibernate.org/orm/downloads/”rel = “ nofollow norefrer”> http://hibernate.org/orm/downloads/下载

  1. Antlr-2.7.7
  2. Cdi-api-1.1
  3. 同学-1.3.0
  4. Dom4j-1.6.1
  5. El-api-2.2
  6. Geronimo-jta _ 1.1 _ spec-1.1.1
  7. Hibernate-commons-批注 -5.0.1. Final
  8. Hibernate-core-5.2.5. 最终版
  9. Hibernate-jpa-2.1-api-1.0.0. Final
  10. Jandex-2.0.3. 最终版
  11. Javassociation-3.20.0-GA
  12. Javax 注入 -1
  13. Jbos- 拦截器-api _ 1.1 _ spec-1.0.0. Beta 1
  14. Jboss-log-3.3.0. 最终版
  15. Jsr250-api-1.0

中创建一个 xml 文件 Xml

YourProject/src/META-INF/

Xml

<?xml version="1.0" encoding="UTF-8"?>


<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">


<persistence-unit name="sample">


<class>org.pramod.data.object.UserDetail</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/hibernate_project"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="root"/>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="false"/>


<property name="hibernate.cache.use_second_level_cache" value="false"/>


<property name="hibernate.archive.autodetection" value="true"/>
</properties>
</persistence-unit>

  1. 请记下在 < perstance > 标签中提到的信息,版本应该是2.1。
  2. 请注意,名称 < perstance-unit > tag,名称被称为 “样本”。在加载您的

EntityManagerFactor = Persisance.createEntityManagerFactory (“ sample”) ; 。“ sample”可以根据您的变数命名原则更改。

现在按照我的示例 UserDetail 在包 对象中创建一个 Entity 类

UserDetail.java

package org.pramod.data.object;


import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;


@Entity
@Table(name = "user_detail")
public class UserDetail {
@Id
@Column(name="user_id")
private int id;
@Column(name="user_name")
private String userName;


public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Override
public String toString() {
return "UserDetail [id=" + id + ", userName=" + userName + "]";
}
}

现在用 main 方法创建一个类。

HibernateTest.java

package org.pramod.hibernate;


import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.pramod.data.object.UserDetail;


public class HibernateTest {
private static EntityManagerFactory entityManagerFactory;


public static void main(String[] args)  {
UserDetail user = new UserDetail();
user.setId(1);
user.setUserName("Pramod Sharma");


try {
entityManagerFactory = Persistence.createEntityManagerFactory("sample");
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
entityManager.persist( user );
entityManager.getTransaction().commit();
System.out.println("successfull");
entityManager.close();
} catch (Exception e) {
e.printStackTrace();
}


}


}

输出将是

UserDetail [id=1, userName=Pramod Sharma]
Hibernate: drop table if exists user_details
Hibernate: create table user_details (user_id integer not null, user_name varchar(255), primary key (user_id))
Hibernate: insert into user_details (user_name, user_id) values (?, ?)
successfull

如果您正在使用 Maven,那么可能是它没有找到 META-INF 文件夹的正确位置。其他人提到了复制文件夹,但另一种对我有效的方法是告诉 Maven 在哪里查找它,使用 <resources>标记。见: http://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory.html

面对同样的问题,很长一段时间都找不到解决的办法

<provider>org.hibernate.ejb.HibernatePersistence</provider>

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

给你中提取溶液

我在这里迟到了几年,但是在使用 Hibernate 3.5.1处理 HSQLDB 和桌面 JavaFX 程序时遇到了同样的异常。我得到了这个线程的帮助和许多尝试和错误的工作。看起来这个错误是针对各种各样的问题得到的:

No Persistence provider for EntityManager named mick

我尝试构建 hibernate 教程示例,但是因为我使用的是 Java10,所以无法让它们轻松地构建和运行。我放弃了,不想浪费时间解决问题。设置模块-info.java 文件(Jigsaw)是许多人还没有发现的另一个问题。

有些令人困惑的是,这两个文件(下面)是我在 build.gradle 文件中仅需要的两个文件。Hibernate 文档并不清楚您需要包含哪些 Jars。Entity-manager 造成了混淆,在最新的 Hibernate 版本中不再需要它,javax.尾随 -api 也不再需要它。注意,我在这里使用的是 Java 10,因此我必须包含 jaxb-api,以避免一些 xml 绑定错误,并在模块 info.Java 文件中添加一个 Java 持久性模块条目。

建筑,梯度

// https://mvnrepository.com/artifact/org.hibernate/hibernate-core
compile('org.hibernate:hibernate-core:5.3.1.Final')


// https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api
compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.0'

Module-info. java

// Used for HsqlDB - add the hibernate-core jar to build.gradle too
requires java.persistence;

使用 hibernate 5.3.1时,您不需要在下面的尾文件尾文件中指定提供程序。如果默认情况下没有提供 Hibernate 提供程序,则选择 Hibernate 提供程序。

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

Xml 文件应该位于正确的目录中,以便:

src/main/resources/META-INF/persistence.xml

单步执行 Intellij 调试器中的 hibernate 源代码(在该代码中检查方言) ,也会抛出完全相同的异常,这是因为尾随.xml 文件中缺少一个方言属性。我添加了以下内容(为 DB 类型添加正确的内容) :

<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>

在这之后我仍然得到了相同的例外,所以在 Intellij 再次通过调试器显示我试图坚持的测试实体(简单的父子例子)缺少 OneToMany,ManyToOne 关系的注释。我修复了这个问题,异常消失了,我的实体被持久化了。

下面是我的最后一个完整的尾文:

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">


<persistence-unit name="mick" transaction-type="RESOURCE_LOCAL">
<description>
Persistence unit for the JPA tutorial of the Hibernate Getting Started Guide
</description>


<!-- Provided in latest release of hibernate
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
-->


<class>com.micks.scenebuilderdemo.database.Parent</class>
<class>com.micks.scenebuilderdemo.database.Child</class>


<properties>
<property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbc.JDBCDriver"/>


<property name="javax.persistence.jdbc.url"
value="jdbc:hsqldb:file:./database/database;DB_CLOSE_DELAY=-1;MVCC=TRUE"/>


<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value=""/>


<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="create"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
</properties>


</persistence-unit>


</persistence>

我可能在这宝石上浪费了半天时间。我的建议是从非常简单的开始——一个具有一个或两个字段的单个测试实体,因为这个异常似乎有许多原因。

我的问题解决了,方法就是在 restence.xml 中添加信息,例如 <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>,然后确保库在类路径上,例如在 Maven 中添加依赖项,例如

<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.5.0</version>
</dependency>

验证永久单元名称

<persistence-unit name="com.myapp.model.jpa"
transaction-type="RESOURCE_LOCAL">
public static final String PERSISTENCE_UNIT_NAME = "com.myapp.model.jpa";
Persistence.createEntityManagerFactory(**PERSISTENCE_UNIT_NAME**);

在我的情况下,它是关于错误的两个属性,如下。当我更改它们时,“没有名为 EntityManager 的持久性提供程序”消失了。

因此,您可以尝试使用属性测试连接,以检查是否一切正确。

<property name="javax.persistence.jdbc.url" value="...”/>
<property name="javax.persistence.jdbc.password" value="...”/>

奇怪的错误,我完全被它弄糊涂了。

在我的例子中,以前我使用的想法是根据数据库模式生成实体,而 persistence.xml是在 src/main/java/META-INF中自动生成的,根据 https://stackoverflow.com/a/23890419/10701129,我将它移动到 src/main/resources/META-INF,也将 META-INF 标记为源根。对我有用。

但是仅仅将原始 META-INF (即 src/main/java/META-INF)标记为源根是不行的,这让我很困惑。

结构是这样的: enter image description here

还可以尝试手动地将尾注.xml 复制到文件夹 <project root>\bin\META-INF中。这使用一个简单的插件项目修复了 EclipseNeon 中使用 EclipseLink 2.5.2的问题。

我也有同样的问题,但这个方法对我很有效:

mvn install -e  -Dmaven.repo.local=$WORKSPACE/.repository.

注意: 上面的 maven 命令将从头开始重新安装所有项目依赖项。由于网络请求专家正在发出请求,您的控制台将装载冗长的日志。

您必须使用文件的绝对路径,否则这将不起作用。然后使用该路径构建文件并将其传递给配置。

@Throws(HibernateException::class)
fun getSessionFactory() : SessionFactory {
return Configuration()
.configure(getFile())
.buildSessionFactory()
}




private fun getFile(canonicalName: String): File {
val absolutePathCurrentModule = System.getProperty("user.dir")
val pathFromProjectRoot = absolutePathCurrentModule.dropLastWhile { it != '/' }
val absolutePathFromProjectRoot = "${pathFromProjectRoot}module-name/src/main/resources/$canonicalName"
println("Absolute Path of secret-hibernate.cfg.xml: $absolutePathFromProjectRoot")
return File(absolutePathFromProjectRoot)
}

GL

来源

我也有同样的问题,我从正在工作的 bean 类中删除了“@ManagedBean”。

当我将所有的 java 类移动到一个不同的包时,我遇到了这个问题。 最后,我发现如果我修改了 myclass 的包,那么我需要在所有引用我的 java 类的持久化单元/类元素中使用新的包来更新尾声.xml。