@ManyToOne отношения никогда не читал - PullRequest
0 голосов
/ 22 апреля 2011

Мне нужно реализовать родительско-дочернее дерево с EclipseLink.

Следующий код компилируется. Хорошо, разумный код DDL генерируется автоматически, но поле children всегда разрешается в пустой набор, а трассировка показывает, что нет запросов , когда-либо выполняемых для заполнения. это поле.

@Entity
public class TreeNode {
  @Id @GeneratedValue
  private int id;

  private TreeNode parent;

  @OneToMany(mappedBy="parent")
  private Set<TreeNode> children;
}

Ответы [ 2 ]

0 голосов
/ 26 апреля 2011

На самом деле, структура реального класса не так проста, и это является источником проблемы в 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, и пока он хорошо справляется с этой конструкцией.

0 голосов
/ 25 апреля 2011

AddNode, похоже, сохраняет дочерний элемент, но если он не работает на управляемом родительском элементе, ему необходимо объединить родительский элемент, чтобы также сохранить изменения в коллекции. В противном случае изменения, внесенные в родительский элемент, не сохраняются в кэше, поэтому изменения не будут отображаться до тех пор, пока он не будет обновлен из базы данных.

...