【问题标题】:Is there a way to have a non-persistent field in GAE/J using JDO?有没有办法使用 JDO 在 GAE/J 中拥有一个非持久字段?
【发布时间】:2010-01-04 04:58:29
【问题描述】:

我不打算让问题成为孩子,因为我必须独立操作它,并且我不想保留问题字段,我会通过手动检索问题来填写它。这是代码。

问卷调查.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;

问题.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(){

    }

会吐出这个错误:

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

【问题讨论】:

    标签: java google-app-engine jdo


    【解决方案1】:

    添加@NotPersistent 可能会有所帮助。

    GAE/J 文档完全具有误导性;他们建议您在每个领域都需要@Persistent,这是完全错误的。所有字段都有一个默认的持久标志......像String、原语、CollectionListSetMap 这样的东西默认是持久的,所以不需要@Persistent。这点已经多次向 Google 提出,但文档仍然有这个。

    如果您想根据 JDO 规范获得清晰的信息,请使用 DataNucleus 文档

    【讨论】:

      【解决方案2】:

      添加“瞬态”也可能有所帮助

      【讨论】:

        猜你喜欢
        • 2018-04-04
        • 2010-12-30
        • 2011-02-15
        • 1970-01-01
        • 2023-02-13
        • 1970-01-01
        • 2021-12-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多