2013-05-19 3 views
2

Я родители-> Детской двунаправленная связью следующим образом ...Spring Data JPA - загрузка родители после явного удаления ребенка возвращает коллекцию детей с удаленным ребенком

class Parent{ 

    @OneToMany(mappedBy="parent", fetch = FetchType.EAGER) 
    Collection<Child> children; 
} 

class Child{ 
    @ManyToOne 
    @JoinColumn(name="PARENT_ID") 
    private Parent parent; 
} 

Когда я удалить ребенок в явном виде, и после этого груза его родитель (со всеми детьми), я получаю ранее удаленные ребенка в детской коллекции родителя ... поставщик JPA является Hibernate ...

Child child= childRepo.findOne(CHILD_ID); 

childRepo.delete(child); 
childRepo.flush(); 

// next, returns collection without deleted child 
Collection<Child> children= childRepo.findAll(); 

Parent parent = parentRepo.findById(PARENT_ID); 

/// next, returns collection including deleted child 
Collection<Child> parentChildren = parent.getChildren(); 

Я не понимаю, в чем проблема? Каждый метод find * выполняет select (в списке эти SELECT записываются в консоль), но они возвращают разные результаты ...

ответ

1

Ваш многопользовательский режим EAGER (по умолчанию). Ваш OneToMany также является EAGER (вы явно отметили его). Итак, когда вы получаете ребенка в своей первой строке кода, JPA также загружает родительский элемент и все дочерние элементы родителя.

Затем вы удаляете ребенка, но вы не удаляете его из сыновей родителя. И поскольку коллекция родительских родителей уже загружена, удаленный ребенок все еще находится в коллекции.

+0

Огромное вам спасибо ... Я знал, что по умолчанию FetchType для OneToMany является ленивым, и я также подумал, что это тоже значение по умолчанию для ManyToOne ... –