我在这里参加聚会已经晚了几年,但是在尝试使Hibernate 3.5.1与HSQLDB和桌面JavaFX程序一起使用时遇到了同样的异常。我在该线程的帮助下进行了大量的反复试验,使其能够正常工作。看来您会因为各种问题而收到此错误:
No Persistence provider for EntityManager named mick
我尝试构建休眠教程示例,但是由于我使用的是Java 10,因此无法轻松构建和运行它们。我放弃了,不是真的想浪费时间解决问题。设置module-info.java文件(Jigsaw)是很多人尚未发现的又一个难题。
令人困惑的是,这些(下面)是我的build.gradle文件中仅需要的两个文件。Hibernate文档不清楚您需要包括哪些Jar。实体管理器引起了混乱,在最新的Hibernate版本中不再需要它,javax.persistence-api也不再需要。注意,我在这里使用Java 10,因此必须包含jaxb-api来解决一些xml-bind错误,并在我的module-info.java文件中添加java持久性模块的条目。
Build.gradle
// 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,您无需在persistence.xml文件中指定提供程序。如果未提供,默认情况下将选择Hibernate提供程序。
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
persistence.xml文件应位于正确的目录中,以便:
src/main/resources/META-INF/persistence.xml
由于在persistence.xml文件中缺少方言属性,因此在Intellij调试器中逐步进入休眠源代码以检查方言,它也会抛出完全相同的异常。我添加了这个(为您的数据库类型添加正确的一个):
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
在此之后,我仍然遇到相同的异常,因此,再次在Intellij中逐步调试程序时,发现我尝试保留的测试实体(简单的父子示例)缺少OneToMany,ManyToOne关系的注释。我解决了这个问题,但异常消失了,我的实体仍然可以正常工作。
这是我完整的最终persistence.xml:
<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>
我可能在这种宝石上浪费了大约半天。我的建议是开始非常简单-具有一个或两个字段的单个测试实体,因为此异常可能有很多原因。