1

如何在 JPA 实体(不是 JDO)中将 id 字段声明为“作为编码字符串的键”以在 GAE 数据存储中使用?您可以找到JDO的示例,但找不到 JPA 的示例。

只要在子父关系中使用实体,就不能声明 id 字段。

所以,我的实体是这样的:

@Entity
public class EntityClass {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
    private String id;

因此,它同时使用 JPA 和 JDO 注释。

因此,在尝试持久化实体对象时,我遇到了一个异常:

如果字段未编码且为字符串类型,则不能有空主键字段。请提供一个值,或者,如果您希望数据存储区代表您生成一个 id,请将字段的类型更改为 Long。org.datanucleus.store.appengine.FatalNucleusUserException:name.xxx.tips.db.User 的主键无效。如果字段未编码且为字符串类型,则不能有空主键字段。请提供一个值,或者,如果您希望数据存储区代表您生成一个 id,请将字段的类型更改为 Long。

完整堆栈跟踪:如果字段未编码且类型为字符串,则不能有空主键字段。请提供一个值,或者,如果您希望数据存储区代表您生成一个 id,请将字段的类型更改为 Long。org.datanucleus.store.appengine.FatalNucleusUserException:name.xxx.tips.db.User 的主键无效。如果字段未编码且为字符串类型,则不能有空主键字段。请提供一个值,或者,如果您希望数据存储区代表您生成一个 id,请将字段的类型更改为 Long。在 org.datanucleus.store.appengine.DatastoreFieldManager.storeStringPKField(DatastoreFieldManager.java:540) 在 org.datanucleus.store.appengine.DatastoreFieldManager.storeStringField(DatastoreFieldManager.java:460) 在 org.datanucleus.state.AbstractStateManager.providedStringField(AbstractStateManager .java:

4

2 回答 2

2

如果使用 JPA,为什么要使用 JDO 注释?用于 JPA 扩展的注释是

org.datanucleus.api.jpa.annotations.Extension

如此处所示

于 2012-11-11T13:42:06.213 回答
1
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import org.datanucleus.api.jpa.annotations.Extension;

@Entity
public class ChildEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
    private String Id;

这对我有用。

于 2014-10-09T07:06:51.373 回答