Проблема дублирования родительско-дочерних категорий

#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:

Вы пробовали устанавливать средство получения, когда оно совпадает с родительским. Также дочерний элемент должен быть одним из двух многих, другой должен быть много для многих. удалите второго родителя и добавьте его в базу данных.