@ManyToMany Невозможно добавить обратную строку в таблицу саморекламы JoinTable. org.hibernate.exception.ConstraintViolationException: не удалось выполнить оператор - PullRequest
0 голосов
/ 26 мая 2020

У меня есть класс Person с отображением. Я хочу добавить два типа отношений между людьми: дружбу и последователей. Дружба означает, что люди есть друг друга в списке друзей. У папок только одно направление связи.

@Entity
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "PERSON_ID")
    @Getter
    @Setter
    private Long id;

    ...

    @Getter
    @Setter
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "RELATIONSHIP",
            joinColumns = {@JoinColumn(name = "PERSON_ID")},
            inverseJoinColumns = {@JoinColumn(name = "FRIEND_ID")})
    private Set<Person> friends = new HashSet<>();

    @Getter
    @Setter
    @ManyToMany(mappedBy = "friends")
    private Set<Person> followers = new HashSet<>();

Я пытаюсь добавить друга. Я предполагаю, что JoinTable «RELATIONSHIP» должен содержать строки: [1,2] и [2,1]. Я программно добавляю строку тестов в базу данных.

@Configuration
@Slf4j
public class LoadDatabase {

    @Bean
    CommandLineRunner initDatabase(PersonRepository repository) {
        return args -> {
            Person p1 = new Person("Test1",
                    "Test1",
                    "Test1",
                    new Date());
            Person p2 = nnew Person("Test2",
                    "Test2",
                    "Test2",
                    new Date());

            Person p3 = nnew Person("Test3",
                    "Test3",
                    "Test3",
                    new Date());

            Person p4 = new Person("Test4",
                    "Test4",
                    "Test4",
                    new Date());

            log.info("Preloading " + repository.save(p1));
            log.info("Preloading " + repository.save(p2));
            log.info("Preloading " + repository.save(p3));
            log.info("Preloading " + repository.save(p4));

            p1.getFriends().add(p2);
            p1.getFriends().add(p3);
            log.info("Update " + repository.save(p1));

            p2.getFriends().add(p4);
            p2.getFriends().add(p1);

            log.info("Update " + repository.save(p2));
        };
    }
}

, но у меня есть ошибка, и я пытаюсь сохранить p2:

Caused by: org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint ["PUBLIC.PRIMARY_KEY_7 ON PUBLIC.RELATIONSHIP(PERSON_ID, FRIEND_ID) VALUES 2"; SQL statement:
insert into relationship (person_id, friend_id) values (?, ?) [23505-200]]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement

Я не могу понять, почему это сопоставление не не работает. Как я могу решить эту проблему?

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