На самом деле, структура реального класса не так проста, и это является источником проблемы в EclipseLink:
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
abstract class TreeNode {
@Id int id;
private TreeNode parent;
@OneToMany(mappedBy="parent")
private Set<TreeNode> children;
}
abstract class NamedNode extends TreeNode { String name, title; }
class ConcreteNode1 extends NamedNode { ... some concrete fields }
class ConcreteNode2 extends NamedNode { ... some concrete fields }
....
Только экземпляры класса ConcreteNodeXXX должны быть созданы, и все они должны наследовать поля имени и заголовка от абстрактного класса NamedNode. EclipseLink не жалуется, но не обрабатывает чтение детей из нескольких таблиц.
Итак, в конце концов я перешел на Hibernate, и пока он хорошо справляется с этой конструкцией.