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

Java MySQL级联删除错误方向的更改(eclipselink作为JPA),java,mysql,sql,eclipselink,cascade,Java,Mysql,Sql,Eclipselink,Cascade,我遇到了一些奇怪的问题: 我有一个表可约束和一个表属性。在属性表中,我使用外键约束指定属性所属的可约束。我在属性表中的外键约束中添加了一个关于删除的级联 现在,如果我想删除属性,那么可约束的也将被删除。。这不应该发生,还是我错了? 我正在使用此方法进行此操作: public void remove(IDBObject obj) throws DBException { if (manager != null) { IDBObject o = null; t

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

我有一个表
可约束
和一个表
属性
。在
属性
表中,我使用外键约束指定
属性
所属的
可约束
。我在
属性
表中的外键约束中添加了一个关于删除的
级联

现在,如果我想删除
属性
,那么
可约束的
也将被删除。。这不应该发生,还是我错了? 我正在使用此方法进行此操作:

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 |可约束ID |值|这是不可能的,正如您正确描述的,它不应该发生。由于计算机很少撒谎,因此一定是配置错误引发了这种行为

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

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

  • 最后,删除ON DELETE级联并查看是否发生了相同的行为,因为级联应该在从可约束表中删除引用行时发生,所以删除属性应该不会对可约束表产生影响


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

好的,我终于明白了发生了什么:

Eclipselink生成了一些错误的实体类,其中每个
Foreignkey关系
都有一个
(cascade=CascadeType.ALL)
。在我移除了课堂上不应该出现的级联之后,一切都很好


如果zou懒得自己编写类,就会发生这种情况:我想说,人们可能会期望生成的类不会出现这样的错误。我现在学到了我的经验

我对级联和无级联都有点胡闹,似乎即使没有级联,它也会被移除。我从数据库中删除了所有级联,但它仍然发生。。。有点开始认为这是eclipselink生成愚蠢SQL的一个问题,如果你移除了所有的级联,并且仍然发生,那么有些事情是非常错误的。更多检查表:您是否正确地删除了子对象而不是父对象,是否有任何活动触发器可以这样做?我正在删除
属性
对象-因此,子对象和父对象不应该被删除。尽管如此。。也没有定义可能这样做的触发器。目前正在进行一些启用和禁用级联的小测试,看看我是否在数据库中得到了不同的行为。我们必须缺少一些东西,但这绝不是预期的行为,它太大了,不能成为库中的bug。当你发现什么地方出了问题时,请毫不犹豫地回答,现在我很好奇到底是什么地方出了问题是的,不可能是个虫子,但一定是我的错。我会发布一个解决方案,一旦我发现了oneAhaha!我从来没有和eclipselink合作过。。。EclipseJava和mysql非常多,但我倾向于采用自己动手的方法来实现每一项功能。大坝泄漏的抽象规律你需要非常深入地了解你正在处理什么,以防你发现意外泄漏+1对于这个答案,如果它发生在其他人身上,可能会很有用。