Spóźniłem się na imprezę o kilka lat, ale trafiłem na ten sam wyjątek, próbując zmusić Hibernate 3.5.1 do pracy z HSQLDB i programem JavaFX na komputery stacjonarne. Mam to do pracy z pomocą tego wątku i wielu prób i błędów. Wygląda na to, że ten błąd pojawia się w przypadku wielu różnych problemów:
No Persistence provider for EntityManager named mick
Próbowałem zbudować przykłady samouczków hibernacji, ale ponieważ używałem Java 10, nie byłem w stanie zmusić ich do łatwego budowania i uruchamiania. Zrezygnowałem z tego, nie chcąc tracić czasu na naprawianie jego problemów. Skonfigurowanie pliku module-info.java (Jigsaw) to kolejna kula ziemska, której wielu ludzi jeszcze nie odkryło.
Nieco mylące jest to, że te (poniżej) były jedynymi dwoma plikami, których potrzebowałem w moim pliku build.gradle. W dokumentacji Hibernate nie ma jasności co do tego, które słoiki należy dołączyć. Entity-manager powodował zamieszanie i nie jest już wymagany w najnowszej wersji Hibernate, podobnie jak javax.persistence-api. Uwaga, używam tutaj Java 10, więc musiałem dołączyć jaxb-api, aby obejść niektóre błędy xml-bind, a także dodać wpis dla modułu trwałości java w moim pliku module-info.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;
W przypadku hibernacji 5.3.1 nie musisz określać dostawcy poniżej w swoim pliku persistence.xml. Jeśli nie zostanie podany, dostawca Hibernacji jest wybierany domyślnie.
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
Plik persistence.xml powinien znajdować się w odpowiednim katalogu, więc:
src/main/resources/META-INF/persistence.xml
Przejście przez kod źródłowy hibernacji w debugerze Intellij, w którym sprawdza on dialekt, również spowodowało ten sam wyjątek z powodu brakującej właściwości dialektu w pliku persistence.xml. Dodałem to (dodaj poprawny dla twojego typu DB):
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
Po tym nadal otrzymałem ten sam wyjątek, więc ponowne przejście przez debugger w Intellij ujawniło, że jednostka testowa, którą próbowałem utrwalić (prosty przykład rodzic-dziecko), miała brakujące adnotacje dla relacji OneToMany, ManyToOne. Naprawiłem to i wyjątek zniknął, a moje jednostki były w porządku.
Oto moja pełna ostateczna persystencja.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>
Prawdopodobnie zmarnowałem około pół dnia na ten klejnot. Radzę zacząć bardzo prosto - pojedyncza jednostka testowa z jednym lub dwoma polami, ponieważ wydaje się, że ten wyjątek może mieć wiele przyczyn.