2014-09-24 3 views
0

Я написал метод службы 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); 
    } 

} 

ответ

0

Если у вас есть каскад ALL типа, то вам не нужно, чтобы сохранить дочернюю сущность во-первых, только родителей.

 category.getchildren().add(children) 
     save(category) 

В этот момент категория сохранит/обновит объект и сделает то же самое для детей. посмотреть другие примеры, чтобы понять, как работает спящий каскад: http://www.mkyong.com/hibernate/hibernate-cascade-example-save-update-delete-and-delete-orphan/

Смежные вопросы