2016-05-11 3 views
0

Рассмотрим у меня есть что-то вроде этого:Java Spring заселение двунаправленного отношения

public class ClassifierGroupEntity extends AbstractEntity{ 
... 
@OneToMany (mappedBy = "parent", 
       fetch = FetchType.EAGER, 
       cascade = CascadeType.PERSIST) 
private List<ClassifierEntity> classifiers; 
... 
} 

-

public class ClassifierEntity extends AbstractEntity { 
... 
    @ManyToOne 
    private ClassifierGroupEntity parent; 
... 
} 

Если я хочу, чтобы добавить новый классификатор к группе, как я должен идти об этом? Это нормально ?:

ClassifierGroupEntity ge = new ClassifierGroupEntity(); 
manager.saveClassifierGroup(ge); 
ClassifierEntity e = new ClassifierEntity(); 
e.setParent(ge); 
manager.saveClassifier(e); 
+0

Да. Все нормально. 'ClassifierEntity' имеет зависимость от' ClassifierGroupEntity' как своего родителя, поэтому сначала вы должны сохранить экземпляр 'ClassifierGroupEntity', а затем экземпляр' ClassifierEntity'. Тем не менее, вы можете сэкономить их сразу, я думаю. – STaefi

ответ

0

Ваш подход будет работать на базовом уровне. Я предпочитаю следующую парадигму (игнорировать имена классов):

package org.example.project.domain; 

@Entity 
class Classifier { 
    @ManyToOne 
    private ClassifierGroup group; 

    public ClassifierGroup getGroup() { return group; } 

    // Package protected to prevent direct access. 
    void setGroup(ClassifierGroup group) { this.group = group; } 
} 

@Entity 
class ClassifierGroup { 
    @OneToMany 
    private List<Classifier> classifiers; 

    public void addClassifier(Classifier classifier) { 
    if(classifiers == null) { 
     classifiers = new ArrayList<Classifier>(); 
    } 

    classifiers.add(classifier); 
    classifier.setGroup(this); 
    } 

    public List<Classifier> getClassifiers() { 
    return Collections.unmodifiableList(classifiers != null ? classifiers : Collections.emptyList()); 
    } 
} 

ClassifierGroup group = new ClassifierGroup(); 
group.addClassifier(new Classifier()); 
manager.saveClassifierGroup(group); 

Или еще лучше, если group является обязательным для Classifier, установить его в самом конструкторе (public Classifier(ClassifierGroup group)).

Эта стратегия имеет следующие основные функции:

  1. Отношения управляются самими субъектами. Внешним сторонам не нужно знать подробности отношений. Это полезно, если объекты могут быть созданы в нескольких местах, и в этом случае код управления отношениями может быть дублирован в кодовой базе.
  2. Предотвращен прямой доступ к данным (только геттеры, нет сеттеров). Поэтому потребитель не может делать group.getClassifiers().clear() или classifier.setGroup(null), что потенциально может привести к повреждению графа объекта.
Смежные вопросы