java.lang.NoSuchMethodError:javax.persistence.EntityManager.setProperty(Ljava / lang / String; Ljava / lang / Ob ject;)V

时间:2014-06-30 22:01:56

标签: hibernate jpa heroku playframework jpa-2.0

我在heroku上部署我的Play 1.2.5应用程序时遇到此错误。

2014-06-30T21:47:45.786454+00:00 app[web.1]: 21:47:45,786 ERROR ~
2014-06-30T21:47:45.786461+00:00 app[web.1]:
2014-06-30T21:47:45.786464+00:00 app[web.1]: @6ilc03hfb
2014-06-30T21:47:45.786466+00:00 app[web.1]: Internal Server Error (500) for req
uest GET /
2014-06-30T21:47:45.786468+00:00 app[web.1]:
2014-06-30T21:47:45.786469+00:00 app[web.1]: Oops: NoSuchMethodError
2014-06-30T21:47:45.786471+00:00 app[web.1]: An unexpected error occured caused
by exception NoSuchMethodError: javax.persistence.EntityManager.setProperty(Ljav
a/lang/String;Ljava/lang/Object;)V
2014-06-30T21:47:45.786473+00:00 app[web.1]:
2014-06-30T21:47:45.786474+00:00 app[web.1]: play.exceptions.UnexpectedException
: Unexpected Error
2014-06-30T21:47:45.786476+00:00 app[web.1]:    at play.Invoker$Invocation.onExc
eption(Invoker.java:244)
2014-06-30T21:47:45.786477+00:00 app[web.1]:    at play.Invoker$Invocation.run(I
nvoker.java:286)
2014-06-30T21:47:45.786479+00:00 app[web.1]:    at Invocation.HTTP Request(Play!
)
2014-06-30T21:47:45.786481+00:00 app[web.1]: Caused by: java.lang.NoSuchMethodEr
ror: javax.persistence.EntityManager.setProperty(Ljava/lang/String;Ljava/lang/Ob
ject;)V
2014-06-30T21:47:45.786483+00:00 app[web.1]:    at play.db.jpa.JPAPlugin.startTx
(JPAPlugin.java:375)
2014-06-30T21:47:45.786484+00:00 app[web.1]:    at play.db.jpa.JPAPlugin.beforeI
nvocation(JPAPlugin.java:345)
2014-06-30T21:47:45.786486+00:00 app[web.1]:    at play.plugins.PluginCollection
.beforeInvocation(PluginCollection.java:473)
2014-06-30T21:47:45.786487+00:00 app[web.1]:    at play.Invoker$Invocation.befor
e(Invoker.java:217)
2014-06-30T21:47:45.786488+00:00 app[web.1]:    at play.Invoker$Invocation.run(I
nvoker.java:277)
2014-06-30T21:47:45.786490+00:00 app[web.1]:    ... 1 more

应用正在使用带postgis扩展名的postgres数据库。任何人都可以帮我解决这个错误吗?

2 个答案:

答案 0 :(得分:1)

通过查看JPA的javadocs可以很容易地看出,JPA 2.0中有一个setProperty方法。因此,您必须使用JPA 1实现,但在CLASSPATH中具有JPA 2 API jar,或者您具有JPA 2实现并且在CLASSPATH中具有JPA 1 API jar

答案 1 :(得分:1)

让Neil Stockton的回答更加清晰:

  1. API - 您编程的JAR集。 这是在您的开发类路径中。通常,API是Java接口或抽象类或委托。如果您使用的是Eclipse,那么这就是Build Path中的那个。在Maven中,这是您在POM中声明的依赖关系。

  2. 实现 - 捆绑在服务器中的JAR集合,或者更具体地说,JPA容器。这些是您在代码中调用的API的实现。这些不在您的开发类路径中,它们是服务器类路径的一部分。它们在运行时由JPA容器(同样是服务器安装的一部分)用作接口的实际类。你的代码将执行委托给。

  3. 使用API​​的其他技术 - 实现兼容性是Servlet API - Web容器,EJB API - EJB容器。

    正如Neil所提到的,您的CODE(dev classpath)使用JPA 2但在服务器类路径上只有JPA 1。

    要解决此问题,您需要查阅服务器文档,了解如何下载支持JPA 2.0的服务器版本。某些服务器允许您更新库,以便JPA 1更新为JPA 2.0。

    如果这是不可能的(即供应商服务器),那么遗憾的是你必须改变你的代码只使用JPA 1兼容的API,这意味着你必须删除对EntityManager.setProperty的调用并试图在其他一些实现它装置