簡體   English   中英

JPA刪除失敗(完整性約束違規:外鍵沒有動作) - 數據模型太復雜了?

[英]JPA delete fails (integrity constraint violation: foreign key no action) - data model too convoluted?

我遇到了一個問題,我無法理解。 我真的希望那里的人可以提供幫助。

實體模型

當我的數據模型代表編程對象時,這可能會得到一點元。 我有三個實體:Program,Clazz和Method。 類可以有多個方法,偶爾會繼承一些其他方法(來自其他類)。

@Entity
public class Program {

    @OneToMany(mappedBy="program", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
    @OrderBy("name ASC")
    private Set<Clazz> clazzes = new TreeSet<Clazz>();
}

@Entity
public class Clazz {

    @ManyToOne
    private Program program;

    @OneToMany(mappedBy="clazz", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
    @OrderBy("name ASC")
    private Set<Method> methods = new TreeSet<Method>();

    @ManyToMany(fetch=FetchType.LAZY, mappedBy="inheritedBy")
    @OrderBy("name ASC")
    private Set<Method> inheritedMethods = new TreeSet<Method>();

    @PreRemove
    private void tearDown() {
        inheritedMethods.clear();
    }

}

@Entity @Table(name="sf_method")
public class Method {

    @ManyToOne(optional=true)
    private Clazz clazz;

    @ManyToMany(fetch=FetchType.LAZY)
    @JoinTable(name = "sf_method_inherited_by_class", 
        joinColumns = { @JoinColumn(name = "sf_method_inherited_by_class") }, 
        inverseJoinColumns = { @JoinColumn(name = "sf_class_inherits_method") }
    )
    private Set<Clazz> inheritedBy = new HashSet<Clazz>();

    @PreRemove
    public void tearDown() {
        inheritedBy.clear();
    }

}

我的問題:我做了什么

我需要做的是刪除一個程序,包括它的所有類和方法。 我使用Spring-JPA存儲庫,所以我的代碼是:

@Autowired ProgramRepository programs;

@Transactional(readOnly=false)
public void forceDelete(Program p) {
    Set<Clazz> myClasses = p.getClazzes();
    for (Clazz c : myClasses) {
        logger.info("Clazz " + c.getName());
        for (Method m : c.getMethods()) {
            m.setClazz(null);
            methods.save(m);
        }
    }
    programs.delete(p);
}

怎么了

刪除代碼僅在某些情況下有效。 有時我會收到以下錯誤。

SqlExceptionHelper - 完整性約束違規:外鍵無動作; FKIBMDD2FV8TNJAF4VJTOEICS73表:SF_METHOD AbstractBatchImpl - HHH000010:在批量發布時它仍然包含JDBC語句

任何想法? 我花了這么多時間在這上面,我每次嘗試解決都失敗了。 我究竟做錯了什么?

在這里,您嘗試刪除父項而不刪除具有引用父項的外鍵的子項。

在這里,在刪除p之前,你必須刪除p的子節點。 你可以通過:p.getClazzes();

在刪除Clazz之前,你必須刪除它的子節點(在本例中為Method),如上所述...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM