java - tutorial - orm hibernate jpa




Avoir JPA/Hibernate pour répliquer la fonctionnalité "ON DELETE SET NULL" (2)

Cela ne semble pas possible pour le moment avec jpa / hibernate.

On delete set null dans hibernate dans @OneToMany

La solution de JB semble propre cependant:

for (Department child : parent.getChildren()) {
    child.setParentDepartment(null);
}
session.delete(parent);

Vous devriez également pouvoir le mettre dans un PreRemove:

@PreRemove
private void preRemove() {
    for (Student s : studentList) {
        s.setTeacher(null);
    }
}

J'ai pu avoir JPA / Hibernate pour répliquer la fonctionnalité ON DELETE CASCADE (semble être le comportement par défaut) mais j'essaie maintenant de répliquer la fonctionnalité ON DELETE SET NULL et je suis confronté à des problèmes.

Ce sont mes deux classes:

@Entity
@Table(name = "teacher")
public class Teacher
{
    @Id
    @GeneratedValue
    @Column(name = "id", nullable = false, length = 4)
    private int id;

    @OneToMany(mappedBy = "teacher")
    private List<Student> studentList;

    // ...
}
@Entity
@Table(name = "student")
public class Student
{
    @Id
    @GeneratedValue
    @Column(name = "id", nullable = false, length = 4)
    private int id;

    @ManyToOne(optional = true)
    @JoinColumn(name = "teacher_id", nullable = true)
    private Teacher teacher;

    // ...
}

Lorsque j'essaie de supprimer un enseignant, l'erreur suivante apparaît:

org.springframework.dao.DataIntegrityViolationException: Impossible d'exécuter la mise à jour par lots JDBC; SQL [supprimer de l'enseignant où teacher_id =?]; contrainte [null]
...
Causé par: org.hibernate.exception.ConstraintViolationException: impossible d'exécuter la mise à jour par lots JDBC
...
Causée par: java.sql.BatchUpdateException: entrée par lot 0 supprimer de l'enseignant où teacher_id = '1' a été abandonné. Appelez getNextException pour voir la cause.

Est-ce que je fais quelque chose de mal? Est-ce quelque chose de réalisable?

Je vous remercie.


Je pense que la meilleure solution est l'utilisateur SQL Statament pour définir sur l'action d'action ass:

CREATE TABLE table_name
(
  column1 datatype null/not null,
  column2 datatype null/not null,
  ...

  CONSTRAINT fk_column
     FOREIGN KEY (column1, column2, ... column_n)
     REFERENCES parent_table (column1, column2, ... column_n)
     ON DELETE SET NULL
);

Lorsque l'utilisateur supprime une ligne par une autre suppression en cascade où vous utilisez une référence de table à cette ligne supprimée, vous ne pouvez pas utiliser la solution Hibernate et renvoyer l'exception SQL.







jpa