GAE データストアで使用するために、JPA エンティティ (JDO ではない) で id フィールドを「エンコードされた文字列としてのキー」として宣言する方法は? JDOの例は見つかりますが、JPA の例は見つかりません。
エンティティが親子関係で使用されているため、ID フィールドを Long として宣言できません。
したがって、私のエンティティは次のようになります。
@Entity
public class EntityClass {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
private String id;
したがって、JPA と JDO の両方のアノテーションを使用します。
そのため、エンティティ オブジェクトを永続化しようとすると、例外が発生します。
フィールドがエンコードされておらず、文字列型である場合、null 主キー フィールドを持つことはできません。値を指定するか、データストアに ID を生成させたい場合は、フィールドのタイプを Long に変更してください。org.datanucleus.store.appengine.FatalNucleusUserException: name.xxx.tips.db.User の主キーが無効です。フィールドがエンコードされておらず、文字列型である場合、null 主キー フィールドを持つことはできません。値を指定するか、データストアに ID を生成させたい場合は、フィールドのタイプを Long に変更してください。
完全な Stacktrace: フィールドがエンコードされておらず、文字列型の場合、主キー フィールドを null にすることはできません。値を指定するか、データストアに ID を生成させたい場合は、フィールドのタイプを Long に変更してください。org.datanucleus.store.appengine.FatalNucleusUserException: name.xxx.tips.db.User の主キーが無効です。フィールドがエンコードされておらず、文字列型である場合、null 主キー フィールドを持つことはできません。値を指定するか、データストアに 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: