【问题标题】:JDO javax.jdo.JDOFatalUserExceptionJDO javax.jdo.JDOFatalUserException
【发布时间】:2014-10-10 07:07:01
【问题描述】:

首先,我在这方面有点菜鸟。所以,我正在尝试使用 GWT2.6.1 和 GAE1.9.9 构建一个 WebApp。

我做过类似的事情......

@PersistenceCapable
@Inheritance(strategy = InheritanceStrategy.SUBCLASS_TABLE)
public abstract class Person implements IsSerializable {

    @PrimaryKey
    @Persistent
    private String googleUserID;
    @Persistent
    private String name;
    @Persistent
    private String secondName;
    @Persistent
    private String surname;
    @Persistent
    private Boolean isActive = false; //default value
    @Persistent
    private String imageURL;
    ...
}

那么,

@PersistenceCapable
@Inheritance(strategy = InheritanceStrategy.NEW_TABLE)
public abstract class User extends Person implements IsSerializable{

    @Persistent
    private String email;
    ...
}

最后,

@PersistenceCapable
@Inheritance(strategy = InheritanceStrategy.NEW_TABLE)
public class Admin extends User implements IsSerializable, Serializable {

    private static final long serialVersionUID = 1L;

    @NotPersistent
    public static final AccountTypes accountType = AccountTypes.Admin;
    ...
}

然后我收到以下错误:

javax.jdo.JDOFatalUserException:在 epusp.pcs.os.model.person.user.Admin 上找到继承策略“new-table”。在这种情况下不支持此策略。有关使用 JDO 继承的信息,请参阅文档:http://code.google.com/appengine/docs/java/datastore/dataclasses.html#Inheritance

我阅读了文档,但我仍然不明白我做错了什么。谁能给个提示?

PS.:我知道,我知道,我计划在未来为 Admin 和 User 添加一些新属性。基本上我想做的是检查用户是否使用 GoogleID 在数据库中注册,然后根据他的 AccountType 将他重定向到指定的 URL(它可能是管理员、超级用户、审计员......)。我正在做这样的事情:

PersistenceManager pm = PMF.get().getPersistenceManager();
Admin user = null;
try{
    user = pm.getObjectById(User.class, userId);
}finally{
    pm.close();
}
switch(user.getType()){
case Admin:
    return "";
case Agent:
    return "";
case Auditor:
    return "";
case Monitor:
    return "";
case SuperUser:
    return "";
default:
    return null;
}

感谢支持!

【问题讨论】:

    标签: google-app-engine gwt jdo


    【解决方案1】:

    “新表”继承策略允许您将单个数据对象的数据拆分到多个“表”中,但由于 App Engine 数据存储区不支持连接,因此使用此继承策略对数据对象进行操作需要每个继承级别的远程过程调用。这可能非常低效,因此不在继承层次结构根部的数据类不支持“新表”继承策略。

    其次,“超类表”继承策略允许您将数据对象的数据存储在其超类的“表”中。尽管此策略没有固有的低效率,但目前不受支持。我们可能会在未来的版本中重新审视这一点。

    现在好消息:“子类表”和“完整表”策略的工作原理如 DataNucleus 文档中所述,您还可以对位于其根目录的任何数据对象使用“新表”继承层次结构。

    【讨论】:

      猜你喜欢
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-31
      • 2010-10-20
      • 2010-11-02
      • 1970-01-01
      相关资源
      最近更新 更多