使用JPA for GAE的自动生成的id(作为编码字符串的键)

时间:2012-11-11 12:00:43

标签: google-app-engine jpa datanucleus datastore

如何在JPA实体(非JDO)中将id字段声明为“Key as encoded String”以用于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注释。

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

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

完整Stacktrace: 如果字段未编码且类型为String,则不能具有空主键字段。请提供值,或者,如果您希望数据存储区代表您生成ID,请将字段类型更改为Long。 org.datanucleus.store.appengine.FatalNucleusUserException:name.xxx.tips.db.User的主键无效。如果字段未编码且类型为String,则不能具有空主键字段。请提供值,或者,如果您希望数据存储区代表您生成ID,请将字段类型更改为Long。     在org.datanucleus.store.appengine.DatastoreFieldManager.storeStringPKField(DatastoreFieldManager.java:540)     at org.datanucleus.store.appengine.DatastoreFieldManager.storeStringField(DatastoreFieldManager.java:460)     at org.datanucleus.state.AbstractStateManager.providedStringField(AbstractStateManager.java:1023)     在name.xxx.tips.db.User.jdoProvideField(User.java)     在name.xxx.tips.db.User.jdoProvideFields(User.java)     在org.datanucleus.state.JDOStateManagerImpl.provideFields(JDOStateManagerImpl.java:2715)     at org.datanucleus.store.appengine.DatastorePersistenceHandler.insertPreProcess(DatastorePersistenceHandler.java:357)     at org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObjects(DatastorePersistenceHandler.java:267)     at org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObject(DatastorePersistenceHandler.java:256)     at org.datanucleus.state.JDOStateManagerImpl.internalMakePersistent(JDOStateManagerImpl.java:3185)     在org.datanucleus.state.JDOStateManagerImpl.flush(JDOStateManagerImpl.java:4513)     at org.datanucleus.state.JDOStateManagerImpl.getExternalObjectId(JDOStateManagerImpl.java:1334)     at org.datanucleus.state.JDOStateManagerImpl.getObjectId(JDOStateManagerImpl.java:1234)     在name.xxx.tips.db.User.jdoGetObjectId(User.java)     在org.datanucleus.jpa.JPAAdapter.getIdForObject(JPAAdapter.java:266)     在org.datanucleus.ObjectManagerImpl.exists(ObjectManagerImpl.java:1953)     在org.datanucleus.jpa.EntityManagerImpl.refresh(EntityManagerImpl.java:469)

2 个答案:

答案 0 :(得分:2)

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

org.datanucleus.api.jpa.annotations.Extension

如图所示here

答案 1 :(得分:0)

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;

这适合我。