为什么遗传深度在GAE的Datanucleus JDO中显着?

时间:2011-08-29 15:03:04

标签: java oop google-app-engine jdo datanucleus

如果我有一个级别的继承,那么一切都在App Engine中保持预期:

Worker.java

import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.Inheritance;
import javax.jdo.annotations.InheritanceStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

@PersistenceCapable
@Inheritance(strategy = InheritanceStrategy.SUBCLASS_TABLE)
public abstract class Worker {
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent
    private String department;
}

Employee.java

// ... imports ...

@PersistenceCapable
public class Employee extends Worker {
    @Persistent
    private int salary;

}

Intern.java

import java.util.Date;
// ... imports ...

@PersistenceCapable
public class Intern extends Worker {
    @Persistent
    private Date internshipEndDate;
}

但是,如果我添加一个额外的继承层,则最高级别子类中的字段不会保留:

Human.java

@PersistenceCapable
public abstract class Human {

    @Persistent
    private String name;
}

Worker.java

@PersistenceCapable
@Inheritance(strategy = InheritanceStrategy.SUBCLASS_TABLE)
public abstract class Worker extends Human {
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent
    private String department;
}

为什么扩展抽象类是可以的,但是不能让抽象类扩展更高级别的类?

2 个答案:

答案 0 :(得分:0)

您的主键现在不在(可持久的)继承树的根类中,因此JDO和JPA规范无效。

答案 1 :(得分:0)

您还应该将以下声明移至Human类:

@Inheritance(strategy = InheritanceStrategy.SUBCLASS_TABLE)