GAE和JPA - java.lang.NoSuchMethodError:org.datanucleus.store.ExecutionContext.findObject

时间:2014-12-01 09:57:55

标签: java google-app-engine jpa

我在申请时使用Google应用引擎和JPA。 我需要调用REST API来插入和获取记录。记录到表的插入工作正常,但是当我使用select查询时,它会产生大量错误。

错误跟踪是:

java.lang.NoSuchMethodError: org.datanucleus.store.ExecutionContext.findObject(Ljava/lang/Object;Lorg/datanucleus/store/FieldValues;Ljava/lang/Class;Z)Ljava/lang/Object;
at com.google.appengine.datanucleus.query.DatastoreQuery.entityToPojoPrimaryKey(DatastoreQuery.java:543)
at com.google.appengine.datanucleus.query.DatastoreQuery.access$100(DatastoreQuery.java:115)
at com.google.appengine.datanucleus.query.DatastoreQuery$1.apply(DatastoreQuery.java:221)
at com.google.appengine.datanucleus.query.DatastoreQuery$1.apply(DatastoreQuery.java:219)
at com.google.appengine.datanucleus.query.LazyResult.resolveNext(LazyResult.java:96)
at com.google.appengine.datanucleus.query.LazyResult.resolveAll(LazyResult.java:121)
at com.google.appengine.datanucleus.query.LazyResult.size(LazyResult.java:115)
at com.google.appengine.datanucleus.query.StreamingQueryResult.size(StreamingQueryResult.java:151)
at org.datanucleus.store.query.AbstractQueryResult.toArray(AbstractQueryResult.java:400)
at java.util.ArrayList.addAll(Unknown Source)
at org.datanucleus.query.evaluator.JavaQueryEvaluator.execute(JavaQueryEvaluator.java:160)
at org.datanucleus.query.evaluator.JPQLEvaluator.execute(JPQLEvaluator.java:112)
at com.google.appengine.datanucleus.query.JPQLQuery.performExecute(JPQLQuery.java:200)
at org.datanucleus.store.query.Query.executeQuery(Query.java:1789)
at org.datanucleus.store.query.Query.executeWithMap(Query.java:1693)
at org.datanucleus.api.jpa.JPAQuery.getResultList(JPAQuery.java:185)

对于select查询,我使用JPA的CriteriaAPI:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Technology> cq = cb.createQuery(Technology.class);
Root<Technology> e = cq.from(entityManager.getMetamodel().entity(Technology.class));
cq.where(cb.equal(e.get(Technology_.name), {technologyName}));
Query query = entityManager.createQuery(cq);
List<Technology> list = query.getResultList();

我的技术课是:     @实体     公共类技术实现Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "TechnologyID")
private Long technologyID;

@Column(name = "Name")
private String name;

public Long getTechnologyID() {
    return technologyID;
}

public void setTechnologyID(Long technologyID) {
    this.technologyID = technologyID;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

}

还有一个实体SignalStrength与Technology有多对一的关系:

@Entity
public class SignalStrength {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "SignalStrengthID")
private Long signalStrengthID;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TechnologyID")
private Technology technology;

@Column(name = "SignalStrengthValue")
private int signalStrengthValue;
public Long getSignalStrengthID() {
    return signalStrengthID;
}

public void setSignalStrengthID(Long signalStrengthID) {
    this.signalStrengthID = signalStrengthID;
}
public Technology getTechnology() {
    return technology;
}

public void setTechnology(Technology technology) {
    this.technology = technology;
}

public int getSignalStrengthValue() {
    return signalStrengthValue;
}

public void setSignalStrengthValue(int signalStrengthValue) {
    this.signalStrengthValue = signalStrengthValue;
}
}

和datanucleus依赖:

<!-- Datanucleus dependencies -->
    <dependency>
        <groupId>com.google.appengine.orm</groupId>
        <artifactId>datanucleus-appengine</artifactId>
        <version>2.0.1.1</version>
    </dependency>
    <dependency>
        <groupId>org.datanucleus</groupId>
        <artifactId>datanucleus-core</artifactId>
        <version>${datanucleus.version}</version>
    </dependency>
    <dependency>
        <groupId>org.datanucleus</groupId>
        <artifactId>datanucleus-api-jpa</artifactId>
        <version>${datanucleus.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.geronimo.specs</groupId>
        <artifactId>geronimo-jpa_2.0_spec</artifactId>
        <version>1.0</version>
    </dependency>
    <dependency>
        <groupId>org.datanucleus</groupId>
        <artifactId>datanucleus-enhancer</artifactId>
        <version>3.1.1</version>
    </dependency>
    <dependency>
        <groupId>javax.persistence</groupId>
        <artifactId>persistence-api</artifactId>
        <version>1.0.2</version>
        <scope>provided</scope>
    </dependency>

我做错了什么?请帮忙。

1 个答案:

答案 0 :(得分:0)

NoSuchMethodError意味着您搞砸了CLASSPATH中的jar。其中一个罐子与另一罐子不一致。在这种情况下,名称中带有datanucleus的罐子就是那些你不一致的罐子。

由于您没有说明您使用的是哪一个,因此您必须找出基于Google文档(或实际提及它们)的内容。此页面告诉您有关一致版本https://code.google.com/p/datanucleus-appengine/wiki/Compatibility

的所有信息