Спящие и родительские / детские отношения - PullRequest
0 голосов
/ 02 апреля 2010

Я использую Hibernate в приложении Java и чувствую, что что-то можно сделать лучше для управления отношениями родитель / ребенок.

У меня есть сложный набор сущностей, которые имеют какие-то отношения между ними (один ко многим, многие ко многим, один к одному, как однонаправленные, так и двунаправленные). Каждый раз, когда объект сохраняется и у него есть родитель, чтобы установить отношения, родитель должен добавить дочерний элемент в свою коллекцию (учитывая отношения один-к-одному). Например:

Parent p = (Parent) session.load(Parent.class, pid);
Child c = new Child();
c.setParent(p);
p.getChildren().add(c);
session.save(c);
session.flush();

Точно так же, если я удаляю ребенка, то я должен явно удалить его и из родительской коллекции.

Child c = (Child) session.load(Child.class, cid);
session.delete(c);
Parent p = (Parent) session.load(Parent.class, pid);
p.getChildren().remove(c);
session.flush();

Мне было интересно, есть ли какие-то лучшие практики для выполнения этой работы другим способом: когда я сохраняю дочернюю сущность, автоматически добавляю ее в родительскую коллекцию. Если я удаляю ребенка, автоматически обновляю родительскую коллекцию, удаляя ребенка и т. Д.

Например,

Child c = new Child();
c.setParent(p);
session.save(c); // Automatically update the parent collection
session.flush();

или

Child c = (Child) session.load(Child.class, cid);
session.delete(c); // Automatically updates its parents (could be more than one)
session.flush();

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

Спасибо

1 Ответ

4 голосов
/ 02 апреля 2010

Один из простых способов достижения этого типа вещей - добавить удобные методы в классы вашей модели, чтобы гарантировать, что оба направления двунаправленной ссылки установлены

public class Parent {
    ...
    public void addChild(Child child) {
        this.getChildren.add(child);
        child.setParent(this);
    }

    public void removeChild(Child child) {
        this.getChildren.remove(child);
        child.setParent(null);
    }

Это требует некоторой дисциплины / памяти с вашей стороны, чтобы использовать эти методы вместо прямого набора / добавления; но лучше всего размещать часто используемый код в одном месте.

...