#java #spring #hibernate #jpa #parent-child
#java #весна #спящий режим #jpa #родительско-дочерний
Вопрос:
У меня следующая проблема. Я искал везде и не мог найти похожий пост. У меня есть файл enum (enumerate), который содержит категории продуктов, и его основная цель — при запуске приложения заполнить базу данных категориями. Категории имеют родительско-дочерний тип. Проблема в том, что когда я добавляю категорию, у которой есть родительский элемент, он снова добавляет родительский элемент (он дублирует).
Пример: у меня есть следующие категории:
категория1
- category2 (подкатегория category1)
- category3 (подкатегория category1)
В базу данных он добавит cat1, cat2, cat3, cat1, cat1, он будет дублировать родительский элемент столько раз, сколько будет добавлена новая подкатегория.
Type.class
@Getter
@Setter
@NoArgsConstructor
@Entity
@Table(name = "types")
public class Type extends BaseEntity {
@Column(name = "name", nullable = false)
private String name;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "parent_id", referencedColumnName = "id")
private Type parent;
@OneToMany(mappedBy = "parent")
private List<Type> children;
}
TypeData.java (перечисление)
Здесь я создаю категории. Если у категории должен быть родитель, я добавляю его, если нет, я оставляю его нулевым.
@Getter
public enum TypeData {
CATEGORY_1("Category 1", null),
CATEGORY_2("Category 2", CATEGORY_1),
CATEGORY_3("Category 3", CATEGORY_1);
private final String name;
private final TypeData parent;
TypeData(String name, TypeData parent) {
this.name = name;
this.parent = parent;
}
}
TypeInitialData.java
Когда я запускаю приложение, этот файл загружает категории в базу данных.
@Component
public class TypeInitialData {
private final TypeService typeService;
private final ModelMapper modelMapper;
@Autowired
public TypeInitialData(TypeService typeService, ModelMapper modelMapper) {
this.typeService = typeService;
this.modelMapper = modelMapper;
}
@PostConstruct
public void init() {
Arrays.stream(TypeData.values())
.forEach(x -> this.typeService.addType(this.modelMapper.map(x, Type.class)));
}
}
Комментарии:
1. Проблема заключается в ModelMapper, который снова создает того же родителя при отображении, и JPA видит, что родитель не существует, поэтому он создает новый. Вы должны повторно использовать сохраненный родительский элемент во всех дочерних элементах.
Ответ №1:
Вы пробовали устанавливать средство получения, когда оно совпадает с родительским. Также дочерний элемент должен быть одним из двух многих, другой должен быть много для многих. удалите второго родителя и добавьте его в базу данных.