【问题标题】:GWT with JPA - no persistence provider带有 JPA 的 GWT - 没有持久性提供程序
【发布时间】:2010-05-15 20:34:04
【问题描述】:

GWT 与 JPA

我的 eclipse 工作区中有两个项目,我们给它们命名:

-JPA项目 -GWT项目

JPAProject 包含 JPA 配置内容(persistence.xml、实体类等)。 GWTProject 是一个示例 GWT 项目(取自官方 GWT 教程)。

这两个项目单独运行良好。也就是说,我可以在 JPAProject 中创建 EMF(EntityManagerFactory)并从数据库中获取实体。 GWTProject 也可以正常运行,我可以运行它,在浏览器中填写字段文本并获得响应。

我的目标是从 GWTProject 调用 JPAProject 来获取实体。但是问题是调用DAO的时候出现如下异常:

[WARN] Server class 'com.emergit.service.dao.profile.ProfileDaoService' could not be found in the web app, but was found on the system classpath
[WARN] Adding classpath entry 'file:/home/maliniak/workspace/emergit/build/classes/' to the web app classpath for this session

[WARN] /gwttest/greet
javax.persistence.PersistenceException: No Persistence provider for EntityManager named emergitPU
    at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source)
    at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source)
    at com.emergit.service.dao.profile.JpaProfileDaoService.<init>(JpaProfileDaoService.java:19)
    at pl.maliniak.server.GreetingServiceImpl.<init>(GreetingServiceImpl.java:21)  
    ...
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
[ERROR] 500 - POST /gwttest/greet (127.0.0.1) 3812 bytes

我想现在可以省略开头的警告。

你有什么想法吗?我想我错过了一些基本观点。非常感谢所有提示。


更新:我的持久性提供程序定义良好,JPA 项目本身运行良好。

我猜这也是与类路径相关的问题。运行 GWT 项目时,WEB-INF/lib 中只有 gwt-servlet.jar

您是否认为制作自定义 Ant 文件来构建整个项目是唯一的解决方案(即从 JPA 项目中制作 jar 并将其复制到 WEB-INF/lib)?或者是否有任何 Eclipse 解决方案,所以我可以正确设置 GWT 项目属性,以便 GWT 项目知道包含persistence.xml 文件?

更新:好的,我搞定了。我试图将 persitence.xml 放在 war/WEB-INF 中可能的任何地方,但不断收到“没有持久性提供程序”错误。事实证明,这与persistence.xml 无关。我没有将 eclipselink jar 复制到 WEB-INF/lib,所以它找不到在 persistence.xml 中定义的提供程序类。复制所有的罐子就可以了。

非常感谢帕斯卡。

【问题讨论】:

  • 您能否确认您没有意外启用 Google App Engine? GAE 不允许您连接到数据库,这是一个非常常见的初学者错误。

标签: java gwt jpa


【解决方案1】:

为同样的错误消息苦苦挣扎,我解决了复制所有 jar 的问题(eclipselink.jar、eclipselink-jpa-modelgen_2.1.0.v20100614-r7608.jar、javax.persistence_1.0.0.jar、javax.persistence_2 .0.1.v201006031150.jar)从 EclipseLink zip 到我的 GWT 项目的 .../war/WEB-INF/lib 文件夹,以使所有内容都可用于托管模式下的 Jetty。 从文件列表中可以看出,我使用的是 EclipseLink 2.1。如有必要,请根据您的 JPA 实现调整此列表。

希望这对您也有帮助。

【讨论】:

  • 非常感谢您的解决方案,漫长的一天搜索终于结束了!
【解决方案2】:

您是否在persistence.xml 中声明了持久性提供程序?像这样的东西(我在这里使用 Hibernate,将其调整为您正在使用的任何持久性提供程序):

<persistence
  <persistence-unit name="emergitPU" transaction-type="...">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    ...
  </persistence-unit>
</persistence>

如果你这样做,那么我怀疑是类路径问题。您是否将 JPA 项目正确打包到 webapp 中,即 WEB-INF/lib 中?

【讨论】:

  • 谢谢。我已经很好地定义了持久性提供程序,我提到 JPA 项目本身运行良好。我想这也是与类路径相关的问题。运行 GWT 项目时,在 WEB-INF/lib 中只有 gwt-servlet.jar。您是否认为制作自定义 ant 文件来构建整个项目是唯一的解决方案(即从 JPA 项目中制作 jar 并将其复制到 WEB-INF/lib)?或者是否有任何 Eclipse 解决方案,所以我可以正确设置 GWT 项目属性,以便 GWT 项目知道包含 persistence.xml 文件?
  • 好的,现在是评论,而不是答案。顺便说一句,不好的是这里不能提供新行,所以不能格式化帖子以便于阅读。我已经用 META-INF/persistence.xml 制作了 jar 并将其放入 WEB-INF/lib 中,但它仍然无法正常工作。我的想法已经用完了,你还有什么要分享的吗?
  • @meliniak 谢谢。万一您没有注意到,您可以编辑您的问题以更新它(我已将后续问题移至初始问题)。现在回到你的问题。将 jar 打包到 WEB-INF/lib 时,您是否收到完全相同的警告?如果没有,您能否使用新的跟踪更新问题?
猜你喜欢
  • 1970-01-01
  • 2014-12-15
  • 1970-01-01
  • 2018-04-03
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
  • 2014-12-07
相关资源
最近更新 更多