sql - 使用 JPA 或数据库内部的级联删除/更新?

标签 sql hibernate jpa hsqldb cascade

性能是关键:在数据库内部级联删除/更新还是让 Hibernate/JPA 处理它更好?

如果级联在 DBMS 内部,这会影响查询数据的能力吗?

如果这很重要,我正在使用 HSQLDB。

最佳答案

在级联更新的情况下,如果数据库中有外键约束,则根本无法在应用程序空间中执行此操作。

示例:假设您有一个美国各州的查找表,主键是两个字母的缩写。然后您有一个用于引用它的邮寄地址表。有人告诉您,您错误地给 Montana 提供了缩写“MO”而不是“MT”,因此您需要在查找表中更改它。

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');

现在您要修复错误,无需借助数据库端级联更新。下面是使用 MySQL 5.0 的测试(假设密苏里州不存在任何记录,实际上它确实使用了缩写“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`))

没有应用程序端查询可以解决这种情况。您需要在数据库中进行级联更新,以便在强制执行参照完整性约束之前以原子方式在两个表中执行更新。

关于sql - 使用 JPA 或数据库内部的级联删除/更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/554750/

相关文章:

sql - 将 xml 列中的数据插入临时表

hibernate - GORM:如何将间隔映射到列?

java - 尝试持久化实体时出现 DataException

java - JpaRepository - Hibernate - java.math.BigInteger 无法转换为 java.lang.Boolean

java - 过滤连接表中的行 - Hibernate 中的多对多

sql - 查找与 mysql 中的一个特定帖子的标签相关的帖子

c# - 将历史数据保存在数据库中

mysql - SQL 返回第 1 列包含 X 和 Y 的行

mysql - FindByUUID() 使用 Spring Data 的 JPA 存储库

mysql - Hibernate JPA是否支持mysql InnoDB和MyISAM引擎