1

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

我有一张桌子Constrainable和一张桌子Attribute。在Attribute表中,我使用外键约束指定属于Constrainable哪个。Attribute我在表CASCADE ON DELETE中的该外键约束中添加了一个Attribute

现在,如果我想删除也被删除的Attribute..Constrainable这不应该发生还是我错了?我正在使用这种方法来做到这一点:

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的更详细的概述:

Constrainable-Table:

| 身份证 |

Attribute-Table

| 身份证 | 约束ID | 价值 | <--- 这里是CASCADE ON DELETE定义

4

2 回答 2

2

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

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

    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 并查看是否发生相同的行为,因为当您从 Constrianable-table 中删除引用的行时应该发生级联,因此删除属性应该对 Constrianable-table 没有影响。

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

于 2013-08-28T13:25:25.573 回答
1

好的,我终于弄清楚发生了什么:

Eclipselink 生成了一些错误的实体类,其中每个类Foreignkey Relationship都有一个(cascade = CascadeType.ALL). 在我删除了不应该一切正常的类中的级联之后。

如果 zou 懒得自己编写类,就会发生这种情况:PI 会说人们可能期望生成的类没有这样的错误。好吧,我现在吸取了教训

于 2013-08-28T14:43:56.223 回答