web-dev-qa-db-fra.com

javax.persistence.PersistenceException: impossible de créer la fabrique de gestionnaire d'entités

Lorsque j'essaie de créer un nouvel EntityManager pour conserver mes données, j'obtiens l'erreur suivante:

javax.persistence.PersistenceException: impossible de construire la fabrique de gestionnaire d'entités

J'utilise le fournisseur JPA-Persistence d'Hibernate ...

malheureusement, je n'ai trouvé aucun article utile dans stackoverflow/avec googler ...

Quelqu'un a-t-il une idée de la cause de l'erreur?

Merci de votre aide!

extraits de code:

création de entitymanager

EntityManager em;
    EntityManagerFactory fact = Persistence.createEntityManagerFactory("bachelordebug"); // Here it crashes
    em = fact.createEntityManager();

stacktrace

javax.persistence.PersistenceException: Unable to build entity manager factory
at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.Java:81)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.Java:54)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.Java:55)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.Java:39)
at com.uzh.platform.api.util.AssignmentUtil.findAll(AssignmentUtil.Java:20)
at com.uzh.platform.api.services.GetAssignments.getAssignments(GetAssignments.Java:22)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:606)
at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.Java:81)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.Java:151)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.Java:171)
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.Java:152)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.Java:104)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.Java:402)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.Java:349)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.Java:106)
at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.Java:259)
at org.glassfish.jersey.internal.Errors$1.call(Errors.Java:271)
at org.glassfish.jersey.internal.Errors$1.call(Errors.Java:267)
at org.glassfish.jersey.internal.Errors.process(Errors.Java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.Java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.Java:267)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.Java:318)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.Java:236)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.Java:1010)
at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.Java:373)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.Java:382)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.Java:345)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.Java:220)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.Java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.Java:1221)
at com.thetransactioncompany.cors.CORSFilter.doFilter(CORSFilter.Java:156)
at com.thetransactioncompany.cors.CORSFilter.doFilter(CORSFilter.Java:233)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.Java:1212)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.Java:399)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.Java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.Java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.Java:766)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.Java:450)
at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.Java:230)
at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.Java:114)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.Java:152)
at org.mortbay.jetty.Server.handle(Server.Java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.Java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.Java:928)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.Java:549)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.Java:212)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.Java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.Java:410)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.Java:582)

persistence.xml

<?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="bachelordebug" transaction-type="RESOURCE_LOCAL">
    <!-- <provider>org.Eclipse.persistence.jpa.PersistenceProvider</provider> -->
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
   <class>com.uzh.platform.data.dao.Assignment</class>
    <properties>
        <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
        <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://127.0.0.1:5432/bachelor"/>
        <property name="javax.persistence.jdbc.user" value="bachelor"/>
        <property name="javax.persistence.jdbc.password" value="bachelor14"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
        <property name="hibernate.hbm2ddl.auto" value="update"/>
        <property name="hibernate.connection.release_mode" value="after_statement"/>
        <property name="connection.pool_size" value="1"/>
        <property name="dialect" value="org.postgresql.Driver"/>
        <property name="current_session_context_class" value="thread"/>
        <property name="cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
        <property name="show_sql" value="true"/>
    </properties>
</persistence-unit>
11
nicost

(Réponse à la question dans les commentaires et modifications. Voir Question sans réponse, mais problème résolu dans les commentaires (ou étendu dans le chat) )

L'OP a écrit:

RESOLU

J'ai enfin trouvé mon erreur!

Dans ma classe JPA-Entity, j'ai mal orthographié mon Named-Query Annotation (même si je ne l'utilise pas)

@NamedQuery(name="Assignment.findAll", query ="SELECT * FROM assignment")

bien sûr, il faut écrire cela en majuscules, c'est-à-dire "Affectation" (c'est-à-dire tous les termes comme ils apparaissent dans la classe de service!)

3 jours perdus avec cette stupide erreur - mais maintenant j'ai appris à le faire! :-)

Merci quand même pour votre aide!

J'ai rencontré la même erreur et, malheureusement, la réponse ci-dessus ne m'a pas beaucoup aidé. J'ai donc regardé d'autres erreurs signalées dans mon cas où j'ai trouvé cette erreur:

com.mysql.cj.core.exceptions.InvalidConnectionAttributeException: The server time zone value 'EEST' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

Je l'ai résolu comme spécifié la réponse this et ses commentaires, en remplaçant mon URL de connexion par: " jdbc: mysql: // localhost: 3306/db? UseUnicode = true & useJDBCCompliantTimezoneShift = true & useLegacyDatetimeCode = false & serverTimezone = UTC "

Cela a résolu toutes les erreurs, y compris celle notée dans cette question:

javax.persistence.PersistenceException: Unable to build entity manager factory

J'espère que cela aide les autres à rencontrer le même problème auquel j'ai été confronté.

1
Loukan ElKadi

Étant donné que l'erreur peut indiquer de nombreuses causes différentes, il semble préférable de trouver la cause en examinant les instructions du journal Hibernate DEBUG (nous utilisons la déconnexion, mais cela devrait fonctionner dans tout autre cadre de journalisation de la même manière):

Avec cela, vous obtenez beaucoup de sortie, mais vous pouvez déterminer les classes réellement intéressantes (il est très probable que vous en repérerez déjà la cause):

// (logback.groovy)

logger( "org.hibernate", DEBUG )

Ce qui pour nous a montré quelque chose comme ce qui suit (où Mapping collection: foo.Bar.field -> some_tab_x était l'information dont nous avions besoin pour repérer le mappage défectueux):

07:32:43.720 D~ [main ~ main] [     :     ] CollectionSecondPass:SecondPass:  67|  
  Second pass for collection: foo.Bar.field
07:32:43.720 D~ [main ~ main] [     :     ] c.a.CollectionBinder:SecondPass: 823|  
  Binding a OneToMany: foo.Bar.field through a foreign key
07:32:43.720 D~ [main ~ main] [     :     ] c.a.CollectionBinder:SecondPass: 861|  
  Mapping collection: foo.Bar.field -> some_tab_x
07:32:43.727 D~ [main ~ main] [     :     ] ePersistenceProvider:gerFactory:  82|  
  Unable to build entity manager factory
07:32:43.743 E~ [main ~ main] [     :     ] .l.f.m.m.MgFooTstJu:AndRethrow:  74|  
  MyException: unit test error loading Foo with id: 4342153208-2: 
  <Java.lang.NullPointerException> => 
  <javax.persistence.PersistenceException: Unable to build entity manager factory>

Pour restreindre à nouveau la journalisation (s'il existe plusieurs emplacements pour corriger votre mappage JPA), nous avons ensuite utilisé quelque chose comme ceci:

// (logback.groovy)

//logger( "org.hibernate", DEBUG )  // log everything

// infos on annotation mappping, e.g. getting NullPointerExceptions with 
//   javax.persistence.PersistenceException: Unable to build entity manager factory
logger( "org.hibernate.cfg.annotations.CollectionBinder", DEBUG )

(Par exemple, dans Eclipse, utilisez simplement CTRL+SHIFT+T pour rechercher le type que vous souhaitez déboguer, si la sortie du journal n'affiche pas le nom de classe complet)

1
Andreas Dietrich