У меня есть два класса, которые зависят друг от друга. и я хочу выполнить каскадное удаление. проблема у меня следующая ошибка:
could not execute statement; SQL [n/a]; constraint [fk5o18odcs53r4t69hbgf35haj3]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
public class Workspace {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", nullable = false, updatable = false)
private Long id;
@Column(name = "name", nullable = false, unique = true)
private String name;
private String description;
@CreationTimestamp
@Column(name = "created_at")
private Date createdAt;
@UpdateTimestamp
@Column(name = "updated_at")
private Date updatedAt;
@OneToMany( fetch = FetchType.LAZY,cascade = CascadeType.REMOVE,orphanRemoval = true)
private List<Project> projects;
public void setId(Long id) {
this.id = id;
}
public List<Project> getProjects() {
return projects;
}
public void setProjects(List<Project> projects) {
this.projects = projects;
}
}
@Entity
@Table(name = "project")
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", nullable = false, updatable = false)
private Long id;
@Column(name = "name", nullable = false)
private String name;
@ManyToOne(fetch = FetchType.LAZY)
private Workspace workspace;
private String description;
@CreationTimestamp
@Column(name = "created_at")
private Date createdAt;
@UpdateTimestamp
@Column(name = "updated_at")
private Date updatedAt;
Проблема в том, что таблицы, созданные с помощью моего JPA, не определяют каскадный тип в правилах удаления. Должен ли я определять типы ограничений непосредственно в sql? Может ли JPA Hibernate не определять эти ограничения?
Я использую spring-boot-starter-data-jpa версии 2.0.4
Которая использует 5.2.17.Final под крышками mvnrepository.com/artifact/org.springframework.boot/…
the tables created with my JPA dont define the cascade type in the delete rules
: зачем им? Эта каскадная директива предназначена для провайдера JPA для обработки отдельных удалений, а не для передачи в базу данных. Чтобы понять, что происходит, вы посмотрите на SQL, вызванный для вашего кода, который выполняет удаление ...
Значит, эти типы ограничений всегда должны добавляться в sql-билет?
какой "sql билет"? Ваш поставщик JPA выдает SQL для удаления строк, когда вы решаете удалить объекты ... POST, что выдается SQL,
Вам необходимо указать параметр mappedBy для отношения OneToMany класса Workspace.
@OneToMany( fetch = FetchType.LAZY,cascade = CascadeType.REMOVE,orphanRemoval = true, mappedBy = "workspace")
private List<Project> projects;
И после этого вы можете удалить рабочую область, и все проекты также будут удалены.
Это чистый вопрос, связанный с JPA / Hibernate, здесь не следует задействовать Spring Boot. Лучше упомянуть используемую версию Hibernate.