2016-04-14 3 views
0

У меня есть следующие объекты:Hibernate слияние не удаляет OneToMany старых объектов

Seminar класс:

@Entity 
@Table(name = "seminars") 
public class Seminar { 

    @Id 
    @GeneratedValue 
    private int id; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "seminar") 
    private List<SeminarParticipation> participations; 
... 
} 

SeminarParticipation класс:

@Entity 
@Table(name = "seminar_participations") 
public class SeminarParticipation { 

    @Id 
    @GeneratedValue 
    private int id; 

    @ManyToOne 
    @JoinColumn(name="seminar_id", nullable=false) 
    private Seminar seminar; 
... 
} 

В DAO я использую EntityManager для работы с таких семинаров:

em.persist(seminar) 
em.merge(seminar) 
em.remove(seminar) 

При сохранении или удалении Seminar объектов создаются/удаляются записи в seminar_participations.

Но когда я пытаюсь обновить семинар (после установки новых List<SeminarParticipation> участия) с использованием метода merge, новые записи создаются в соответствии со списком, но старые не удаляются.

Упорно код:

1) код контроллера (я также пытался обновить существующий список, он не работает, а):

seminar.setParticipations(newParticipations); 
seminarService.updateSeminar(seminar); 

2) Класс обслуживания

@Service 
public class SeminarServiceImpl implements SeminarService { 

@Autowired 
private SeminarDAO seminarDAO; 

@Override 
    public void updateSeminar(Seminar seminar) { 
     seminarDAO.update(seminar); 
    } 
... 
} 

3) класс DAO

@Repository 
public class SeminarDAOImpl implements SeminarDAO { 

    @PersistenceContext 
    private EntityManager em; 

    @Override 
    @Transactional 
    public void update(Seminar seminar) { 
     em.merge(seminar); 
    } 
... 
} 

Как я могу решить эту проблему? Есть ли способ, не удаляя их вручную в DAO?

+0

Укажите, что вы хотите удалить? – bmarkham

+0

Ах, подождите, я понимаю, что вы имеете в виду. Вы просто хотите использовать слияние, если хотите обновить. 'persist' и' remove' не нужны. По крайней мере, я думаю, что знаю, чего ты хочешь. Потому что наличие 'persist'' merge' и 'remove' все в одном для одного объекта ... ну, я никогда не видел этого – bmarkham

+0

Извините, я имею в виду только то, что я использую эти методы, а не то, что я вызываю их в этом порядке в один раз :) – Luo

ответ

0

em.flush() перед удалением элементов.

1

Вы должны попробовать использовать параметр orphanRemoval = true для @OneToMany.

+0

Я пробовал. Не работает :( – Luo

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