#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);
и все будет хорошо.