gpt4 book ai didi

java - JPA 删除失败(违反完整性约束 : foreign key no action) - data model too convoluted?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:17:40 25 4
gpt4 key购买 nike

我遇到了一个无法解决的问题。我真的希望有人能提供帮助。

实体模型

这可能有点元数据,因为我的数据模型表示编程对象。我有三个实体: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 - integrity constraint violation: foreign key no action; FKIBMDD2FV8TNJAF4VJTOEICS73 table: SF_METHOD AbstractBatchImpl - HHH000010: On release of batch it still contained JDBC statements

有什么想法吗?我在这上面花了很多时间,但每次解决问题的尝试都失败了。我做错了什么?

最佳答案

在这里,您尝试删除父项而不删除具有引用父项的外键的子项。

在这里,在删除 p 之前,您必须删除 p 的子项。您可以通过以下方式获得:p.getClazzes();

同样,在删除 Clazz 之前,您必须删除它的子项(在本例中为 Method),如上...

关于java - JPA 删除失败(违反完整性约束 : foreign key no action) - data model too convoluted?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32939616/

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