Ont JPA/Hibernate à reproduire le “on DELETE SET NULL” fonctionnalité
J'ai pu JPA/Hibernate à reproduire le ON DELETE CASCADE
fonctionnalité avec succès (on dirait que le comportement par défaut), mais je suis maintenant en essayant de reproduire le ON DELETE SET NULL
fonctionnalité 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 s'affiche:
org.springframework.dao.DataIntegrityViolationException: impossible d'exécuter JDBC mise à jour par lot; SQL [supprimer de l'enseignant où teacher_id=?]; contrainte [null]
...
Causés par: org.mise en veille prolongée.exception à la règle.ConstraintViolationException: impossible d'exécuter JDBC mise à jour par lot
...
Causés par: java.sql.BatchUpdateException: saisie des Lots 0 supprimer de l'enseignant où teacher_id='1' a été abandonnée. Appel getNextException pour voir la cause.
Je fais quelque chose de mal? Est-il quelque chose de réalisable?
Merci.
- voulez-vous définir toutes les colonnes de ce dossier est à null ? ou tous les champs de l'étudiant de l'entité
- Je veux le
student
'steacher
colonne de devenirnull
après lastudent
'steacher
est supprimé du système. - Non pas que vous souhaitez modifier votre schéma de JPA, mais je serais curieux de savoir l'effet de l'évolution à un ManyToMany avec cascade la suppression sur la table de jointure. Il faut supprimer l'association et de laisser l'étudiant.
Vous devez vous connecter pour publier un commentaire.
Il ne semble pas être possible pour le moment avec jpa/hibernate.
On delete set null en veille prolongée dans @OneToMany
JBs solution semble propre bien:
Vous devez également être en mesure de le mettre dans un PreRemove:
@PreRemove
solution n'est pas portable. Voir JPA spec section 3.5. En général, la méthode du cycle de vie d'une application portable ne doit pas [...] de modifier les relations au sein du même contexte de persistance.Que sur la définition de
?
Je pense que la meilleure solution est un utilisateur de SQL pour le réglage sur la suppression de l'action comme suit:
lorsque l'utilisateur supprime une ligne par d'autres de suppression en cascade où vous utilisez une table de référence pour cette ligne supprimée, vous ne pouviez pas utiliser hibernate solution et retour exception SQL.