我正在GAE上创建一个应用程序,在该应用程序中,我必须使用odata提供数据库(数据存储)的其余接口。我正在将odata4j库用于odata生产者实现。我是odata的新手。我已经使用jpa在GAE数据存储上提供了访问层。现在我有什么问题。

@Entity
@Table(name = "Submission")
//@IdClass(java.lang.Long.class)
public class Submission implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic
private Long submissionId;

private String status;
private Long userId;
private Date createdDate;

public Long getUserId() {
    return userId;
}

public void setUserId(Long userId) {
    this.userId = userId;
}

public Date getCreatedDate() {
    return createdDate;
}

public void setCreatedDate(Date createdDate) {
    this.createdDate = createdDate;
}

public Long getSubmissionId() {
    return submissionId;
}

public void setSubmissionId(Long submissionId) {
    this.submissionId = submissionId;
}

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

}


我有简单的实体Submission。通过EntityManager,我保留了一些Submission实体。当我点击以下odata url时,我将获得所有提交

http://localhost:8888/odata.svc/Submission


我还有其他一些实体,并且适用于所有实体。我使用$filter来查询实体,它也可以工作。现在,当我想使用其id(primary key)获得单个实体时,我得到了无效密钥类型的错误。用于获取单个submission的OData URL是

http://localhost:8888/odata.svc/Submission(12345567889)


调试odata库后,我在静态方法中发现了什么

typeSafeEntityKey(EntityManager em,EntityType<?> jpaEntityType,OEntityKey entityKey)


在odata库中的JPAProducer类中,有一行我们试图从中找出提交实体的ID类型

 Class<?> javaType = jpaEntityType.getIdType().getJavaType();


获得类型后,我们尝试找出其类型。我期望id类型应为java.lang.Long,但它始终为javax.jdo.identity.LongIdentity。在odata4j中,由于抛出异常,此类型无效。

经过更多调试,我发现Submission实体具有@ id-class值javax.jdo.identity.LongIdentity,这是由于getIdType()函数将其id类型设置为LongIdentity

在我的提交实体类中,我尝试使用值为java.lang.Long的@Idclass批注,但在控制台中出现以下错误:

 **Class "com.convergent.model.Submission" has been specified with an object-id class   java.lang.Long which doesnt have a default constructor. All objectId classes MUST have a   default constructor.**


我不知道该怎么办,因为我无法使用@IdclassgetIdType()赋予LongIdentity类型的ID。谢谢阅读

最佳答案

该问题自2012年3月以来一直为人所知,但仍未解决:https://code.google.com/p/odata4j/issues/detail?id=149

最可能的odata4j不支持DataNucleus作为JPA ODataProducer。不过,直接支持AppEngine的数据存储区是stated,例如:http://code.google.com/p/odata4j/source/browse?repo=samples&name=0.4#hg%2Fodata4j-appengine

应该可以在AppEngine的数据存储区中直接使用odata4j,并在应用程序的其他部分同时使用JPA,但是在缓存时应格外小心。

更新:

看起来odata4j已经死了,自2012年8月以来没有新版本发布,自2013年4月以来没有开发活动的迹象...因此,我建议您寻找替代方案。您可以尝试Apache Olingo,它现在应该支持GAE:https://issues.apache.org/jira/browse/OLINGO-150

10-06 03:00