web-dev-qa-db-ja.com

javax.persistence.PersistenceException:エンティティマネージャーファクトリを構築できません

データを永続化するために新しいEntityManagerを作成しようとすると、次のエラーが表示されます。

javax.persistence.PersistenceException:エンティティマネージャーファクトリを構築できません

HibernateのJPA-Persistence Providerを使用しています...

残念ながら、stackoverflow /グーグルで有用な投稿を見つけることができませんでした...

エラーの原因がどこにあるのか誰にも分かりますか?

ご協力ありがとうございました!

code-snippets:

entitymanagerの作成

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

スタックトレース

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

(質問はコメントと編集で回答しました。 回答なしの質問ですが、問題はコメントで解決されました(またはチャットで拡張されました) を参照してください)

OPは書いた:

解決済み

私はついに私のエラーを見つけました!

JPA-Entityクラスで、Named-Query注釈(使用していなくても)

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

もちろん、大文字、つまり「割り当て」で記述する必要があります(つまり、サービスクラスに現れるようなすべての用語!)

このバカなエラーで3日間無駄になりましたが、今ではその方法を学びました! :-)

とにかくあなたの助けをありがとう!

同じエラーが発生しましたが、残念ながら上記の答えはあまり役に立ちませんでした。だから私はこのエラーを見つけた私のケースで報告された他のエラーを見ました:

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.

接続URLを「jdbc:mysql:// localhost:3306/db?useUnicode =」に置き換えて、 this 回答とコメントの指定に従って解決しましたtrue&useJDBCCompliantTimezoneShift = true&useLegacyDatetimeCode = false&serverTimezone = UTC "

これで、この質問に記載されているものを含むすべてのエラーが解決されました。

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

これが、私が直面したのと同じ問題に出くわす他の人の助けになることを願っています。

1
Loukan ElKadi

エラーは多くの異なる原因を示している可能性があるため、原因に到達するのが最善のようですHibernate DEBUGログステートメントを調べる(logbackを使用しますが、他のロギングフレームワークでも同様に機能するはずです):

これにより多くの出力が得られますが、実際に興味深いクラスを判別できます(おそらくここで原因を見つける可能性が高いです)。

// (logback.groovy)

logger( "org.hibernate", DEBUG )

次のようなものを示しました(where Mapping collection: foo.Bar.field -> some_tab_xは、誤ったマッピングを見つけるために必要な情報でした):

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>

ロギングを再度制限するために(JPAマッピングを修正する場所が複数ある場合)、次のようなものを使用しました。

// (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 )

(たとえば、EclipseではCTRL+SHIFT+Tログ出力に完全なクラス名が表示されない場合、デバッグしたいタイプを検索します)

1