Каскадное удаление в режиме гибернации не работает при использовании sql-запроса

#java #mysql #spring #hibernate #orm

Вопрос:

У меня есть Пользовательская сущность, связанная с Дневной Сущностью с отображением OneToMany. Я пытаюсь удалить сущность пользователя и удалить ее дни с помощью CascadeType.REMOVE. но когда я использую sql-запрос таким образом, каскадирование не работает

         Query theQuery =
                currentSession.createQuery(
                        "delete from User where id=:userId");
        theQuery.setParameter("userId", id);

        theQuery.executeUpdate();

 

теперь, когда я пытаюсь удалить пользователя таким образом, каскадирование работает, и его дни также удаляются :

  Session currentSession = entityManager.unwrap(Session.class);

        user gets deleted
        User theUser = findById(id);

        currentSession.remove(theUser);

 

Это сопоставление сущностей пользователя

 
@Entity
@Table(name="user")
public class User {


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

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

    @OneToMany(mappedBy = "user", cascade = {CascadeType.REMOVE})
    List<Day> days;
 
}

 

вот отображение сущности моего дня

 
@Entity
@Table(name = "day")
public class Day {


    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id ;


    @Column(name = "date")
    Date date ;

    @ManyToOne()
    @JoinColumn(name = "user_id")
    User user ;

   
}

 

вот ошибка, которую я получаю :

 : Cannot delete or update a parent row: a foreign key constraint fails (`demo`.`day`, CONSTRAINT `day_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`))
 

Комментарии:

1. Собственные запросы игнорируют аннотацию hibernate.

2. итак, должен ли я всегда читать объект перед его удалением, чтобы связанные с ним объекты были удалены с помощью каскадирования? @Йенс

Ответ №1:

В таблице базы данных «день» при создании необходимо добавить идентификатор пользователя «при удалении каскада». Или мигрировать:

 alter table day add foreign key (ID) references user(ID) on DELETE CASCADE