我在这里聚会晚了几年,但我在尝试让 Hibernate 3.5.1 与 HSQLDB 和桌面 JavaFX 程序一起工作时遇到了同样的异常。在这个线程的帮助下,我得到了它的帮助,并进行了大量的试验和错误。似乎您会因各种问题而收到此错误:
No Persistence provider for EntityManager named mick
我尝试构建 hibernate 教程示例,但因为我使用的是 Java 10,我无法让它们轻松构建和运行。我放弃了,并不是真的想浪费时间解决它的问题。设置一个 module-info.java 文件(Jigsaw)是另一个很多人还没有发现的毛球。
有点令人困惑的是,这些(下)是我在 build.gradle 文件中需要的仅有的两个文件。Hibernate 文档并不清楚您需要包含哪些 Jars。Entity-manager 引起了混乱,在最新的 Hibernate 版本中不再需要,javax.persistence-api 也不需要。请注意,我在这里使用的是 Java 10,因此我必须包含 jaxb-api,以解决一些 xml-bind 错误,并在我的 module-info.java 文件中添加 java 持久性模块的条目。
构建.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'
模块信息.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
在 Intellij 调试器中单步执行 hibernate 源代码(它会在其中检查方言)也抛出了完全相同的异常,因为persistence.xml 文件中缺少方言属性。我添加了这个(为您的数据库类型添加正确的一个):
<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>
我可能在这颗宝石上浪费了大约半天时间。我的建议是从非常简单的开始 - 具有一两个字段的单个测试实体,因为看起来这个异常可能有很多原因。