У меня есть класс 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
Я не могу понять, почему это сопоставление не не работает. Как я могу решить эту проблему?