【问题标题】:MySQL cascade on delete changes in wrong direction (eclipselink as JPA)MySQL级联删除错误方向的更改(eclipselink作为JPA)
【发布时间】:2013-08-28 13:00:53
【问题描述】:

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

我有一张桌子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 概要:

Constrainable-Table:

|身份证|

Attribute-Table:

|身份证 |约束ID |价值 | CASCADE ON DELETE 的定义

【问题讨论】:

    标签: java mysql sql eclipselink cascade


    【解决方案1】:

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

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

      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,请注意这些级联如何通过您的架构传播)

    • 1234563 /p>

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

    【讨论】:

    • 我在级联和没有级联的情况下有点搞砸了,即使没有级联,它似乎仍然被删除。我从数据库中删除了所有级联,它仍然发生......有点开始认为这是 eclipselink 生成愚蠢的 SQL 的问题
    • 如果你删除了所有的级联并且仍然发生,那就是非常非常错误的事情。更多清单:您是否正确删除了子对象而不是父亲,是否有任何活动触发器可以做到这一点?
    • 我正在删除 Attribute 对象 - 因此子对象和它永远不应该删除父对象。但确实如此..也没有定义可能这样做的触发器。目前正在做一些启用和禁用级联的小测试,看看我是否对数据库中的东西有不同的行为
    • 我们必须缺少一些东西,但这绝不应该是预期的行为,而且它太大而不能成为库中的错误。当您发现问题所在时,请毫不犹豫地回答,现在我很好奇出了什么问题。 :)
    • 是的,不可能真的是一个错误,但一定是我的错。我会在找到解决方案后立即发布解决方案
    【解决方案2】:

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

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

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

    【讨论】:

    • 啊哈哈!我从来没有使用过eclipselink... eclipse java 和mysql 很多,但我倾向于对everyhitng 使用自己动手做的方法。 Dam 泄漏抽象定律joelonsoftware.com/articles/LeakyAbstractions.html 您需要非常深入地了解您正在使用的内容,以防您发现意外的泄漏... +1 这个答案,因为如果它发生在其他人身上可能会有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    相关资源
    最近更新 更多