Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 删除前检查外键约束冲突_Java_Spring_Spring Data Jpa - Fatal编程技术网

Java 删除前检查外键约束冲突

Java 删除前检查外键约束冲突,java,spring,spring-data-jpa,Java,Spring,Spring Data Jpa,我试图确定是否可以从存储库中删除对象。换句话说:删除是否会导致DataIntegrityViolationException。 如果无法删除,这意味着隐藏前端上的“删除”按钮 例如: 我有A班和B班: @实体 公共A类{ @身份证 私有UUID; @纵队 私有字符串名称; @许多 私有集bs=新HashSet(); //getter,setter,equals,。。。 } @实体 公共B级{ @身份证 私有UUID; @纵队 私有字符串名称; //getter,setter,equals,。。

我试图确定是否可以从存储库中删除对象。换句话说:删除是否会导致DataIntegrityViolationException。 如果无法删除,这意味着隐藏前端上的“删除”按钮

例如: 我有A班和B班:

@实体
公共A类{
@身份证
私有UUID;
@纵队
私有字符串名称;
@许多
私有集bs=新HashSet();
//getter,setter,equals,。。。
}
@实体
公共B级{
@身份证
私有UUID;
@纵队
私有字符串名称;
//getter,setter,equals,。。。
}
现在,如果我想删除任何A对象集中的B对象,我将得到一个“DataIntegrityViolationException”。当然,因为该对象正被用作密钥

我想先检查A,看看是否有任何引用,我可以安全地删除我的B实例。但在实践中,这可能有点棘手,因为不止一个类可以使用类B,其他类稍后将由不熟悉代码的其他人添加。还有这个

aRepository.findAll(例如,of(新的A(null,null,新的HashSet(Array.asList(b)));
因此,仅交付了绝对垃圾(对于a b,超过20个对象未在任何地方使用)

第二个想法是尝试这样的东西:

@Transactional//始终回滚
使用中的公共无效(B)引发交易例外{
b.删除(构成);
抛出新的TransactionException();
}
然后像这样检查它:

公共布尔可删除(B){
试一试{
因努塞(b);
}捕获(DataIntegrityViolationException e){
返回false;//约束冲突-->正在使用中!
}捕捉(交易异常e){
返回true;
}
}
不幸的是,这些方法似乎都不起作用。
你知道如何解决这个问题吗?

也许你可以让你的
@ManyToMany
关联双向,比如把这个添加到你的类
B

@ManyToMany(mappedBy = "bs")
private Set<A> as = new HashSet<>();

多对多意味着有一个中间表,其中id位于类型A上,由类型B的id引用。简单检查此表中是否存在id将确定数据具有引用,因此无法删除。当然,此表存在,但完全由Spring数据管理,我不知道有什么好的方法访问此表表,而无需手动实现。此外,这不包括我不知道的实体可能引用我的情况。可能重复此项-这也可能有帮助-我同意,这将避免很多麻烦,但不幸的是,这似乎不适用于此特定情况:(@floo是吗?您无法更改B,还是出现了一些错误?如果只是无法工作,您可以尝试显式声明多个映射表,而不是让JPA从默认值创建它。如果您在以前的尝试中已经存在以前的映射表,则它可能无法正常工作。
someB.getAs().isEmpty()