Почему глубина наследования имеет большое значение в Datanucleus JDO на GAE?

Если у меня есть один уровень наследования, все сохраняется в App Engine, как и ожидалось:

Рабочий.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;
}

Сотрудник.java

// ... imports ...

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

}

Стажер.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;
}

Рабочий.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;
}

Почему можно расширять абстрактный класс, но нельзя, чтобы этот абстрактный класс расширял класс более высокого уровня?


person Chuck Fitcher    schedule 29.08.2011    source источник


Ответы (2)


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

person DataNucleus    schedule 29.08.2011
comment
Следуя вашему совету, я переместил поле первичного ключа из Worker в Human. Теперь, когда я создаю экземпляр сотрудника, я получаю сообщение об ошибке: Exception: javax.jdo.JDOFatalUserException: Found inheritance strategy 'superclass-table' on com.foo.Employee. This strategy is not supported in this context. - person Chuck Fitcher; 29.08.2011
comment
Поэтому укажите стратегию наследования для этого класса! согласно спецификации JDO - person DataNucleus; 29.08.2011

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

@Inheritance(strategy = InheritanceStrategy.SUBCLASS_TABLE)
person Thanos Makris    schedule 31.08.2011