有没有办法在GAE/J中使用JDO获得非持久性字段?

iva*_*ras 0 java google-app-engine jdo

我不打算成为一个孩子的问题,因为我不得不独立操纵它,而且我不想坚持问题领域,我会通过手动检索问题来填补它.这是代码.

Questionnaire.java

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Questionnaire{
    //supposedly non-persistent
    public List<Question> questions  = new ArrayList<Question>();

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    public Long questionnaireID;

    @Persistent
    public String title;

    @Persistent
    private int items;

    @Persistent
    public String description;
Run Code Online (Sandbox Code Playgroud)

Question.java

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Question{
    //non-persistent as well
    public ArrayList<Choice> choiceList = new ArrayList<Choice>();

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    public Long questionID;

    @Persistent 
    public String text;

    @Persistent 
    public long questionnaireID;


    public Question(){

    }
Run Code Online (Sandbox Code Playgroud)

会吐出这个错误:

org.datanucleus.store.appengine.MetaDataValidator $ DatastoreMetaDataException:com.ivanceras.server.Question.questionID的元数据错误:不能有java.lang.Long主键并且是子对象(拥有字段是com.ivanceras .server.Questionnaire.questions).

Dat*_*eus 5

添加@NotPersistent可能有帮助.

GAE/J文件完全具有误导性; 他们建议你需要@Persistent在每个领域,这是完全错误的.所有字段都有一个默认持续标志......之类的东西String,元,Collection,List,Set,Map在默认情况下持久的,因此没有必要@Persistent对这些.这一点已经向Google多次提出,但文档仍然有这个.

如果您想要根据JDO规范获得明确信息,请使用DataNucleus文档