Проблема ограничения внешнего ключа связанного с Hibernate - PullRequest
0 голосов
/ 30 апреля 2019

Я устанавливаю API Springboot, который использует спящий режим для связи с базой данных. У меня есть таблица User, и каждый пользователь должен иметь возможность следить за другими пользователями. Я не имел опыта работы с hibernate, поэтому через некоторое время я получил что-то, что, казалось бы, работало, за исключением того, что я не могу удалить пользователя, если за этим конкретным пользователем следят другие пользователи. Это из-за ограничения внешнего ключа.

Вот как выглядит пользователь:

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(unique = true)
    @JsonProperty
    private int id;

    @Column(unique = true)
    @JsonProperty
    private String email;

    @Column
    @JsonProperty
    private String hashedSaltedPassword;

    @Column
    @JsonProperty
    private String salt;

    @Column
    @JsonProperty
    private String firstName;

    @Column
    @JsonProperty
    private String lastName;

    @JsonProperty
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinTable(name = "User_Follows", schema = "todo", joinColumns=@JoinColumn(name="user_id"))
    private List<User> follows;

Это создает пользовательскую таблицу и отдельную таблицу с именем User_Follows. Эта таблица имеет user_id и follow_id, который является идентификатором пользователя, за которым следуют. Это почти то, чего я хочу.

Удаление пользователя работает идеально, если за ним не следят другие пользователи (если пользователь не указан в столбце follow_id).

Но выдает следующую ошибку, если это так:

The DELETE statement conflicted with the REFERENCE constraint "FKc38v25qxktm9b0r7lg1s2t1tl". The conflict occurred in database "dbi390100_db", table "todo.User_Follows", column 'follows_id'.

Этого не должно быть, я хочу, чтобы все строки, в которых существует userId таблицы User_Follows, удалялись при каждом удалении пользователя.

Есть ли решение для этого?

1 Ответ

0 голосов
/ 30 апреля 2019

Есть два способа выполнить то, что вы хотите.

  • Определите свойство mappedBy с другим полем, чтобы hibernate узнал обо всех отношениях, например:
@ManyToMany(targetEntity = User.class, mappedBy = "follows")
private List<User> followers = new ArrayList<>();

Вы можете взглянуть на этот другой вопрос

  • Или вы можете создать метод @PreRemove в своем пользовательском классе, чтобы вручную удалить все ссылки вашего пользователя:
@PreRemove
private void removeFromFollowers() {
   for (User user : followers) {
       user.removeFollowed(this);
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...