如何在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)
答案 0 :(得分:2)
答案 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;
这适合我。