Почему глубина наследования значима в Datanucleus JDO на GAE? - PullRequest
1 голос
/ 29 августа 2011

Если у меня один уровень наследования, в 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 голосов
/ 01 сентября 2011

Вы также должны переместить следующую декларацию в класс Human:

@Inheritance(strategy = InheritanceStrategy.SUBCLASS_TABLE)
0 голосов
/ 29 августа 2011

И ваш первичный ключ теперь не входит в корневой класс (персистентного) дерева наследования, поэтому недопустим в спецификациях JDO и JPA.

...