12

当我尝试创建一个新的 EntityManager 来保存我的数据时,我收到以下错误:

javax.persistence.PersistenceException:无法建立实体管理器工厂

我使用 Hibernate 的 JPA-Persistence Provider ...

不幸的是,我在 stackoverflow / 谷歌搜索中找不到任何有用的帖子......

有谁知道错误的原因可能在哪里?

谢谢您的帮助!

代码片段:

创建实体管理器

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)

持久性.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>

4

4 回答 4

2

(在评论和编辑中回答了问题。请参阅没有答案的问题,但问题在评论中解决(或在聊天中扩展)

OP写道:

解决了

我终于找到了我的错误!

在我的 JPA-Entity 类中,我拼错了我的Named-Query注释(即使我不使用它)

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

当然必须用大写字母来写,即“分配”(即所有术语,就像它们出现在服务类中一样!)

这个愚蠢的错误浪费了 3 天 - 但现在我学会了如何去做!:-)

无论如何感谢您的帮助!

于 2015-01-26T15:28:00.830 回答
1

Since the error can indicate a lot of different causes it seems best to get to the cause examining the Hibernate DEBUG log statements (we use logback, but it should work in any other logging framework similarly):

With this you get a lot of output, but can determine the actually interesting classes (it is very likely you will spot the cause here already):

// (logback.groovy)

logger( "org.hibernate", DEBUG )

Which for us showed something like the following (where Mapping collection: foo.Bar.field -> some_tab_x was the info we needed to spot the faulty mapping):

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>

To restrict the logging again (if there are multiple places to fix your JPA mapping), we then used something like the following:

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

(E.g. in Eclipse just use CTRL+SHIFT+T to search for the type you like to debug, if the log output does not show the complete classname)

于 2017-09-21T06:27:21.747 回答
0

在您的实体类中添加 id 注释

@Entity
public class yourClass{
  @Id
  private Long id;
  ...
 }
于 2020-11-27T17:15:01.067 回答
0

我遇到了同样的错误,不幸的是上面的答案对我没有多大帮助。因此,我查看了在我发现此错误的情况下报告的其他错误:

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.

我通过将我的连接网址替换为:“ jdbc:mysql://localhost:3306/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC ” ,按照指定的这个答案和评论解决了它

这解决了所有错误,包括这个问题中提到的错误:

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

我希望这可以帮助其他人遇到我面临的同样问题。

于 2016-10-27T19:57:08.360 回答