我正在关注这个JPA 2.1 StoredProcedureQuery作为我正在做的事情的一个例子。
无论如何,我在名为“ XYZ”的数据库中有一个存储过程,我创建了一个类:
@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课程:
@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
由于
答案 0 :(得分:1)
您的项目编译看起来正确引用了JPA 2.1,但是NoSuchMethodError
表示运行时可用的EntityManager
来自早期的JPA版本。 EntityManager
可能由您的EJB容器提供。请查阅您正在使用的任何应用程序服务器的文档,以确定如何升级到JPA 2.1。
编辑:
您还应该在pom.xml中将应用程序服务器提供的任何maven依赖项标记为<scope>provided</scope>
。