JPA 存储过程 NoSuchMethodError

JPA Stored procedure NoSuchMethodError

我将此 JPA 2.1 StoredProcedureQuery 作为我正在处理的示例。

无论如何,我在数据库中有一个名为“XYZ” 的存储过程,我创建了一个 class:

@NameStoredProcedureQuery(
        name = "createXYZ",
        procedureName = "ZYX",
        resultClasses = XYZObj.class,
        parameters={
             @StoredProcedureParameter(mode=ParameterMode.IN, name = "name", type = String.class),
             @StoredProcedureParameter(mode=ParameterMode.OUT, name = "id", type = String.class)})
public class XYZObj {
    private String id;
    private String name;
    ...
}

这是我的 DAO class:

@Stateless
public class XYZDAO{
    @PersistenceContext(unitName = "PU")
    private EntityManager em;
    public String createXYZ(String name){
         StoredProcedureQuery query = em.createNamedStoredProcedureQuery("createXYZ");
         query.setParameter("name", name);
         query.execute();
         return query.getOutputParameterValue("id")
    }
   ...
}

RESTFUL:

@Stateless
@Path("/XYZ")
public class XYZServlet{
   @EJB
   private XYZDAO xyzDao;
   @GET
   @Path("test")
   public Response test(){
         xyzDao.createXYZ("myname");
         return Response.satus(Status.NO_CONTENT).build();
   }
}

pom.xml

...
<dependencies>
<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>javax.persistence</artifactId>
    <version>2.1.0</version>
</dependency>
<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>org.eclipse.persistence.jpa</artifactId>
    <version>2.6.0-M3</version>
</dependency>

...

我在这一行收到 NoSuchMethodError。

 StoredProcedureQuery query = em.createNamedStoredProcedureQuery("createXYZ");

有谁知道为什么?我使用的 JPA 版本正确吗?我错过了什么?

这是我遇到的实际错误。

java.lang.ClassCastException: java.lang.NoSuchMethodError cannot be cast to java.lang.exception
     at javax.ejb.EJBException.getCauseByException(EJBException.java:23)
     at com.sun.jersey.server.impl.ejb.EJBExceptionMapper.toResponse(EJBExceptionMapper.java:63)
     at com.sun.jersey.server.impl.ejb.EJBExceptionMapper.toResponse(EJBExceptionMapper.java:54)
     at com.sun.jersey.server.impl.ejb.EJBExceptionMapper.toResponse(EJBExceptionMapper.java:67)
     at com.sun.jersey.server.impl.ejb.EJBExceptionMapper.toResponse(EJBExceptionMapper.java:54)
    truncated. see log file for complete stacktrace

谢谢

您的项目编译看起来正确地引用了 JPA 2.1,但是 NoSuchMethodError 表示运行时可用的 EntityManager 来自早期的 JPA 版本。 EntityManager 可能由您的 EJB 容器提供。请查阅您正在使用的任何应用程序服务器的文档以确定如何升级到 JPA 2.1。

编辑: 您还应该在 pom.xml.

中将应用程序服务器提供的任何 Maven 依赖项标记为 <scope>provided</scope>