Hibernate 5.2 удалить каскадом на моих таблицах postgres

У меня есть два класса, которые зависят друг от друга. и я хочу выполнить каскадное удаление. проблема у меня следующая ошибка:

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 не определять эти ограничения?

Это чистый вопрос, связанный с JPA / Hibernate, здесь не следует задействовать Spring Boot. Лучше упомянуть используемую версию Hibernate.

Xtreme Biker 13.09.2018 15:41

Я использую spring-boot-starter-data-jpa версии 2.0.4

tarek hentati 13.09.2018 15:55

Которая использует 5.2.17.Final под крышками mvnrepository.com/artifact/org.springframework.boot/…

Xtreme Biker 13.09.2018 15:56
the tables created with my JPA dont define the cascade type in the delete rules: зачем им? Эта каскадная директива предназначена для провайдера JPA для обработки отдельных удалений, а не для передачи в базу данных. Чтобы понять, что происходит, вы посмотрите на SQL, вызванный для вашего кода, который выполняет удаление ...
user3973283 13.09.2018 15:58

Значит, эти типы ограничений всегда должны добавляться в sql-билет?

tarek hentati 13.09.2018 16:09

какой "sql билет"? Ваш поставщик JPA выдает SQL для удаления строк, когда вы решаете удалить объекты ... POST, что выдается SQL,

user3973283 13.09.2018 16:30
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
688
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам необходимо указать параметр mappedBy для отношения OneToMany класса Workspace.

@OneToMany( fetch = FetchType.LAZY,cascade = CascadeType.REMOVE,orphanRemoval = true, mappedBy = "workspace") 
private List<Project> projects;

И после этого вы можете удалить рабочую область, и все проекты также будут удалены.

Другие вопросы по теме