сессия # обновление не обновить корневую сущность с помощью @ManyToOne и составного ключа - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть следующие сущности и сопоставление:

@Entity
public class Father {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    @OneToMany(mappedBy = "father", cascade = CascadeType.ALL)
    private Set<Child> childs = new HashSet<>();

    // getters and setters

}

и

@Entity
@IdClass(Child.ChildPk.class)
public class Child {

    @Id
    @JoinColumn(name = "father_id")
    @ManyToOne(optional = false)
    private Father father;

    @Id
    @Column(name = "name")
    private String name;

    public Child() {

    }

    // getters and setters

    static class ChildPk implements Serializable {

        private Father father;
        private String name;

        // getters and setters
        // equals and hashcode on both father and name
    }
}

Как видите, мой класс Child имеет составной ключ для всех своих членов, включая@OneToMany ссылка на Father.

Проблема, с которой я сталкиваюсь, заключается в следующем: когда я пытаюсь обновить сущность Father (session.refresh(father)), она не обновляется правильно: дочерний элемент перезагружаетсяи Отец внутри Ребёнка тоже, но не корневой Отец.

Я попытался воспроизвести в упрощенном контексте (простой проект Spring Boot с H2 и JPA, и теперь я получаю ошибку StackOverflow из-за бесконечногоцикл загрузки сущностей).

Что-то не так с моим отображением?

Вот проект github, который воспроизводит ошибку: https://github.com/bpagnier/test-jpa

Спасибо!:)

1 Ответ

0 голосов
/ 20 сентября 2018

Кто-то помог мне найти решение: изменив конфигурацию каскада OneToMany, удалив REFRESH, он работает!

До:

@OneToMany(mappedBy = "father", cascade = CascadeType.ALL)

После:

@OneToMany(mappedBy = "father", cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE})

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...