Дерево с JPA [/ Hibernate] - PullRequest
       5

Дерево с JPA [/ Hibernate]

2 голосов
/ 25 февраля 2011

Гррррр, пытаюсь реализовать очень простое дерево.Он не должен быть двунаправленным (поскольку обходы только сверху вниз), поэтому я предполагаю, что было бы лучше (то есть более эффективно использовать пространство), если бы он был однонаправленным, хотя мое отображение не выполняется:

@Entity
public class Node extends Model {

    @Column(nullable=false, unique=true)
    public String description;

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    public List<Node> children = new LinkedList<Node>();

    public Node() {}
    public Node(String description) {
        this.description = description;
    }

    public void addChild(String description) {

        Node child = new Node(description);
        child.save();

        this.children.add(child);
    }
}

Под "неудачей" я подразумеваю, что дочерние отношения не отображаются, следующий модульный тест не пройден;последний assert ожидает 1, но получает 0. В разделе CRUD приложения я вижу, что оба узла фактически созданы и сохранены, но родительский узел не имеет дочерних элементов.Из этого я делаю вывод, что отображение нарушено:

public void testMenu() {

    Node root = Node.find("byDescription", "root").first();
    if (root == null) {
        root = new Node("root");
        root.save();
    }

    assertNotNull(root);

    root.addChild("child 1");

    JPA.em().flush();
    JPA.em().getTransaction().commit();
    JPA.em().getTransaction().begin();
    JPA.em().clear(); // clear cache to grab the root from the db

    root = Node.find("byDescription", "root").first();
    assertEquals(1, root.children.size());

}

Я использую Play !, поэтому все эти члены являются публичными, а не частными, почему нет методов получения / установки и почему нет'это поле Id (Id наследуется от класса Model).По этой же причине есть некоторые нестандартные функции, такие как find() и save().Они функционируют очень интуитивно, и доступ к публичным членам «преобразуется» через отражение, чтобы вызывать установщики и получатели, которые предоставляются или создаются.

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

Приветствия.

Обновление:

Спящий журнал:

Hibernate: /* from models.Node where description = ? */ select node0_.id as id35_, node0_.description as descript2_35_ from Node node0_ where node0_.description=? limit ?
Hibernate: /* insert models.Node */ insert into Node (description) values (?)
Hibernate: /* insert models.Node */ insert into Node (description) values (?)
Hibernate: /* from models.Node where description = ? */ select node0_.id as id35_, node0_.description as descript2_35_ from Node node0_ where node0_.description=? limit ?
Hibernate: /* load collection models.Node.children */ select children0_.Node_id as Node1_35_1_, children0_.children_id as children2_1_, node1_.id as id35_0_, node1_.description as descript2_35_0_ from Node_Node children0_ inner join Node node1_ on children0_.children_id=node1_.id where children0_.Node_id=?

1 Ответ

1 голос
/ 25 февраля 2011

Это поможет, если вы вставите журнал гибернации.

Это не должно быть строго необходимо, но вы можете попробовать root.save () после root.addChild ("child 1");

Кроме того, вы не зафиксировали транзакцию, это не было бы проблемой, если бы Node.find () использовал тот же сеанс, но делает это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...