我正在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.**
我不知道该怎么办,因为我无法使用
@Idclass
和getIdType()
赋予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