Допустим, у меня есть три класса.
public class Parent {
@Id
@GeneratedValue
@Column(name = "parent_id", updatable = false, insertable = false)
private Long id;
private String name;
@Builder.Default
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
Set<Child> childs = new HashSet<>();
}
public class Child {
@Id
@GeneratedValue
@Column(name = "child_id", updatable = false, insertable = false)
private Long id;
private String name;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name ="parent_id")
Parent parent;
@Builder.Default
@OneToMany(mappedBy = "child", cascade = CascadeType.ALL)
Set<GrandChild> grandChildren = new HashSet<>();
}
public class GrandChild {
@Id
@GeneratedValue
@Column(name = "grandchildid", updatable = false, insertable = false)
private Long id;
private String name;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "child_id")
Child child;
}
Если я создам новый GrandChild grandChild
с помощью parent.getChilds().get(0).getGranChilds().add(grandChild)
и сохраню сущность с помощью parentRepo.save(parent)
.Локальная переменная grandChild
не будет иметь id
.Но если я сначала сброшу, а затем сохраню, локальная переменная будет иметь идентификатор?Это то, что вы обычно делаете?
Я думал, что это произойдет, когда вы сохраните, а затем сбросите.Но, похоже, работает только тогда, когда я ПЕРВЫЙ сброс, а затем сохранить.
Добавление grandChild:
GrandChild grandChild = GrandChild.builder().name(name).build();
Parent parent = parentRepo.findAll().get(0);
Optional<Child> optional = parent.getChilds().stream().findAny();
optional.ifPresent(child -> child.getGrandChildren().add(grandChild));
(Это всего лишь код для примера, так что не обращайте внимания на уродство).
Сохранение с очисткой после (без идентификатора, сгенерированного для локальной переменной, объект все еще сохраняется):
parentRepo.saveAndFlush(parent);
System.out.println(grindChild.getId()); // null
Сброс до (локальная переменная получает идентификатор):
parentRepo.flush();
parentRepo.save(parent);
System.out.println(grandChild.getId()); //not null, value exists
Идентификатор в обоих случаях генерируется в базе данных.