gpt4 book ai didi

java - MySQL 级联删除错误方向的更改(eclipselink 作为 JPA)

转载 作者:行者123 更新时间:2023-11-29 05:27:26 24 4
gpt4 key购买 nike

我遇到了一些奇怪的问题:

我有一个表 Constrainable 和一个表 Attribute。在 Attribute 表中,我指定 Constrainable 中的 Attribute 属于外键约束。我向 Attribute 表中的外键约束添加了一个 CASCADE ON DELETE

现在,如果我想删除 AttributeConstrainable 也会被删除。这不应该发生,或者我错了吗?我正在使用这种方法:

public void remove(IDBObject obj) throws DBException {
if (manager != null) {
IDBObject o = null;
try {
o = manager.getReference(obj.getClass(), obj.getPrimaryKey());
} catch (EntityNotFoundException e) {
throw new DBException("Entity doesnt exist");
}
manager.getTransaction().begin();
manager.remove(o);
manager.getTransaction().commit();
return;
}
throw new DBException("Manager is closed or null");
}

这种行为的原因可能是什么?

DB 的更详细概要:

约束表:

|编号 |

属性表:

|编号 |可约束ID |值(value) | <--- 这是定义的 CASCADE ON DELETE

最佳答案

那是不可能的,正如您所描述的那样,这不应该发生。由于计算机很少撒谎,因此一定是配置错误引发了这种行为。

  • 检查外键是否正确定义:

    ALTER TABLE Attribute-Table ADD CONSTRAINT FK_attr_constr FOREIGN KEY (Constrainable-ID) REFERENCES Constrainable-Table (ID) ON DELETE CASCADE ON UPDATE NO ACTION;
  • 检查 Constrainable-Table 表没有在任何地方引用属性表,或其他可能最终引用属性的表。 (如果您有多个 CASCADE,请注意这些级联如何通过您的模式传播)

  • 最后删除 ON DELETE CASCADE 并查看是否发生相同的行为,因为级联应该在您从 Contrainable-table 中删除引用的行时发生,删除属性应该不会影响 Constrianable-table。

作为一般规则,除非您 100% 确定 CASCADE,否则应尽可能避免 CASCADE,因为如果其他开发人员不知道 CASCADE,他可能会在处理另一件事时发现此问题。

关于java - MySQL 级联删除错误方向的更改(eclipselink 作为 JPA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18488690/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com