От одного до многих двунаправленных сопоставлений для уже сохраненных данных в спящем режиме

#spring-boot #hibernate #nhibernate-mapping

Вопрос:

Я пытаюсь обновить свой родительский класс уже сохраненными дочерними объектами.

 @Entity
public class Parent {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  @OneToMany(mappedBy = "parent")
  private Set<Child> children = new HashSet<>();

  public void addChild(Child child){
     this.children.add(child);
     child.setParent(this);
  }
}

@Entity
public class Child {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name="parent_id")
  private Parent parent;

  public void setParent(Parent parent) {
    this.parent = parent;
  }
}

...

Seeder logic
@Autowired
private ParentRepository parentRepository;
@Autowired
private ChildRepository childRepository;

Child c1 = new Child();
childRepository.save(cr1);

Parent p1 = new Parent();
p1.addChild(c1)
parentRepository.save(p1);
 

Этот сегмент кода выполняется, но он никогда не обновляет parent_id в дочерней таблице и всегда отображается как Null.
Когда я добавляю cascade all в родительский класс, он выдает меня detached entity passed error , так как ребенок уже существует. Удаление всего каскада и добавление типа каскада.СЛИЯНИЕ запускает код, однако внешний ключ в дочернем элементе по-прежнему пуст.

 @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
 

Поэтому как мне справиться с этой ситуацией? В моем сценарии ребенок будет присутствовать в базе данных раньше родителя.

Ответ №1:

при использовании CascadeType.ALL : @OneToMany(сопоставление = «родитель», каскад = CascadeType.ALL)

Вам просто нужно сделать это для сохранения операции :

 @Autowired
private ParentRepository parentRepository;

Child c1 = new Child();
Parent p1 = new Parent();
p1.addChild(c1)
parentRepository.save(p1);
 

и все будет хорошо.