Я написал метод службы importCategories()
, который извлекает список категорий из базы данных и рекурсивно заполняет свойства и родительские категории. Проблема, которую я испытываю, заключается в том, что новые категории создаются дважды, за исключением, когда я комментирую complete()
с @Transactional
. Может ли кто-нибудь объяснить мне, почему это так? Я сохраняю дочерний элемент перед его добавлением к родительскому элементу, а затем сохраняет родительский элемент, который имеет CascadeType.ALL
в дочерней коллекции.Данные Spring JPA создаются дважды
Модель:
@Entity
public class Category implements Identifiable<Integer> {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private Integer key;
private String name;
@ManyToOne
private Category parent;
@OneToMany(mappedBy="parent", cascade = {CascadeType.ALL})
private List<Category> children = new ArrayList<Category>();
public void add(Category category) {
category.setParent(this);
children.add(category);
}
}
Услуги:
@Transactional
private void complete(Category category) {
// ... (getting category info such as "name" and "parent key" from web service)
category.setName(name);
category = categoryRepository.saveAndFlush(category);
if (category.getParent() == null) {
Category parentCategory = new Category();
parentCategory.setKey(parentKey);
List<Category> categories = categoryRepository.findByKey(parentKey);
if (categories.size() > 0) {
parentCategory = categories.get(0);
}
parentCategory.add(category);
parentCategory = categoryRepository.saveAndFlush(parentCategory);
if (parentCategory.getParent() == null) {
complete(parentCategory);
}
}
}
public void importCategories() {
List<Category> list = categoryRepository.findAll();
for (Category category : list) {
complete(category);
}
}