Почему дочерние объекты дублируются в БД каждый раз, когда я сохраняю родительский объект - PullRequest
1 голос
/ 21 января 2020

У меня есть юридические лица "ZakladProdukcyjny" и "MiejsceProwadzeniaDzialnosci". Существует однонаправленное отношение @OneToMany с таблицей соединений.

@OneToMany(fetch = FetchType.LAZY,  cascade = CascadeType.ALL, orphanRemoval = true)
   @JoinTable(name = "ZAKLAD_PRODUKCYJNY_MIEJSCE_PROWADZENIA_DZIALALNOSCI",
           joinColumns = {
              @JoinColumn(name = "zakladProdukcyjny_ID")},
           inverseJoinColumns = {
              @JoinColumn(name = "miejsceProwadzeniaDzialalnosci_ID")})
   private List<MiejsceProwadzeniaDzialalnosci> miejscaProwadzeniaDzialalnosci = new ArrayList<>();

Я использую Spring JPARepositories

public interface ZakladProdukcyjnyRepository extends JpaRepository<ZakladProdukcyjny, Long>,

Каждый раз, когда я сохраняю родительский объект с zakladProdukcyjnyRepository.save(zakladProdukcyjny), дочерние объекты будучи сохраненным в БД, поэтому каждый раз при выполнении сохранения в JPARepository у меня дублируются записи.

Дочерняя сущность использует lombok для генерации equals и хэш-кода.

@EqualsAndHashCode(callSuper=false)
public class MiejsceProwadzeniaDzialalnosci extends BaseEntity {

Я понятия не имею, что здесь может быть не так.

Ответы [ 2 ]

1 голос
/ 21 января 2020

Это должно быть исправлено долгое время a go:

https://hibernate.atlassian.net/browse/HHH-5855

https://hibernate.atlassian.net/browse/HHH-6776

Попробуйте изменить List на Set или удалить CascadeType.ALL и оставить только CascadeType.MERGE.

0 голосов
/ 22 января 2020

Я решил проблему. Проблема была в равной функциональности. Где-то в коде у меня было:

    for (MiejsceProwadzeniaDzialalnosci mpd : uaktualnioneMiejscaProwadzeniaDzialalnosciZBDO) {
        if (!(zaklad.getMiejscaProwadzeniaDzialalnosci().contains(mpd))) {
            zaklad.getMiejscaProwadzeniaDzialalnosci().add(mpd);
        }
    }

после овверидинга метода equals нет дубликатов.

...