Мой первый проект с Hibernate / JPA и Play !, у меня есть меню, которое когда-то будет работать, будет поддерживать изменения (то есть легко добавлять узлы в дерево).Изо всех сил (в смысле> 5 часов), чтобы собрать вместе базовое моделирование:
Модель:
@Entity
@Table(name = "Node")
public class Node extends Model {
@Column(nullable=false)
public String description;
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name="parent")
public List<Node> children = new LinkedList<Node>();
@ManyToOne
@JoinColumn(name="parent", insertable=false, updatable=false)
public Node parent;
public Node(){}
}
Класс утилит:
public class NodeUtil {
public static void addChild(Node root, String description) {
Node child = new Node();
child.description = description;
child.parent = root;
root.children.add(child);
root.save();
}
private static final String MENU_NAME = "MainMenu";
public static Node getMenu() {
return getRoot(MENU_NAME);
}
public static Node getRoot(String name) {
Node root = Node.find("byDescription", name).first();
if (root == null) {
root = new Node();
root.description = name;
root.save();
}
return root;
}
}
Тест:
public class MenuTest extends UnitTest {
private static final String TEST_MENU = "testMenu";
@Test
public void testMenu() {
// test build/get
Node root = NodeUtil.getRoot(TEST_MENU);
assertNotNull(root);
// delete all children - maybe from previous tests etc.
for(Node o : root.children)
o.delete();
root.save();
// test add
root = NodeUtil.getRoot(TEST_MENU);
NodeUtil.addChild(root, "child 1");
NodeUtil.addChild(root, "child 2");
NodeUtil.addChild(root, "child 3");
assertEquals(3, root.children.size());
assertEquals("child 3", root.children.get(2).description);
assertEquals(0, root.children.get(1).children.size());
Node node = root.children.get(1);
NodeUtil.addChild(node, "subchild 1");
NodeUtil.addChild(node, "subchild 2");
NodeUtil.addChild(node, "subchild 3");
NodeUtil.addChild(node, "subchild 4");
NodeUtil.addChild(root.children.get(2), "sub subchild");
assertEquals("sub subchild", root
.children.get(1)
.children.get(2)
.children.get(0)
.description);
assertEquals(4, root.children.get(1).children.size());
root.save();
// test delete
root = NodeUtil.getRoot(TEST_MENU); // regrab the root via hibernate, assuming there isnt it isnt cached this will get changes that have been persisted to the db (maybe?)
root.children.get(1).children.get(2).delete();
assertEquals(3, root.children.get(1).children.size());
//root.delete();
}
}
Вопросы:
Что я делаю не так?(Т.е. я просто не могу смоделировать эту простую идею и пройти модульный тест. Как я уже говорил, новичок в Hibernate, и каждое внесенное мной изменение приводит к новому варианту ошибки Hibernate, который для меня ничего не значит. Например, этот текущийsetup бросает «отдельную сущность, переданную в persist: models.Node»)
Изначально у меня был весь класс util в виде набора статических методов в классе модели.Во-первых, влияют ли статические методы на моделирование Hibernates?Если так, вкратце, при каких обстоятельствах я могу иметь статические методы (и члены, если подумать), которые будут «переходными» для моделирования объекта?
Предполагая, что яхраните методы util в отдельном общедоступном классе util, где этот класс традиционно хранится в инфраструктуре воспроизведения?На данный момент он находится в пакете моделей, рядом с Node.java.