Dans le cas de mises à jour en cascade, vous ne pouvez simplement pas le faire dans l'espace application si vous avez des contraintes de clé étrangère dans la base de données. Exemple: disons que vous avez une table de recherche pour les états américains, avec une clé primaire de l'abréviation à deux lettres. Ensuite, vous avez une table pour les adresses postales qui le référence. Quelqu'un vous dit que vous avez donné par erreur à Montana l'abréviation "MO" au lieu de "MT". Vous devez donc le changer dans la table de recherche.
CREATE TABLE States (st CHAR(2) PRIMARY KEY, state VARCHAR(20) NOT NULL);
INSERT INTO States VALUES ('MO', 'Montana');
CREATE TABLE Addresses (addr VARCHAR(20), city VARCHAR(20), st CHAR(2), zip CHAR(6),
FOREIGN KEY (st) REFERENCES States(st));
INSERT INTO Addresses VALUES ('1301 East Sixth Ave.', 'Helena', 'MO', '59620');
Maintenant, vous allez corriger l'erreur, sans l'aide de mises à jour en cascade de la base de données. Voici un test utilisant MySQL 5.0 (supposons qu'il n'existe aucun enregistrement pour Missouri, qui utilise l'abréviation "MO").
UPDATE States SET st = 'MT' WHERE st = 'MO';
ERROR 1451 (23000): Cannot delete or update a parent row:
a foreign key constraint fails (`test/addresses`,
CONSTRAINT `addresses_ibfk_1` FOREIGN KEY (`st`) REFERENCES `states` (`st`))
UPDATE Addresses SET st = 'MT' WHERE st = 'MO';
ERROR 1452 (23000): Cannot add or update a child row:
a foreign key constraint fails (`test/addresses`,
CONSTRAINT `addresses_ibfk_1` FOREIGN KEY (`st`) REFERENCES `states` (`st`))
UPDATE Addresses JOIN States USING (st)
SET Addresses.st = 'MT', States.st = 'MT'
WHERE States.st = 'MO';
ERROR 1451 (23000): Cannot delete or update a parent row:
a foreign key constraint fails (`test/addresses`,
CONSTRAINT `addresses_ibfk_1` FOREIGN KEY (`st`) REFERENCES `states` (`st`))
Aucune requête côté application ne peut résoudre cette situation. Vous avez besoin de mises à jour en cascade dans la base de données pour effectuer la mise à jour dans les deux tables de manière atomique, avant que la contrainte d'intégrité référentielle ne soit appliquée.
Je rencontre à peu près le même problème. Jusqu'à présent, il semble que personne ne peut vraiment dire quelle est la corrélation entre les cascades JPA/DB en termes de performance. –