#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