1

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:

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 に答える