【发布时间】:2019-06-04 18:21:48
【问题描述】:
我正在尝试确定是否可以从存储库中删除对象。换句话说:删除是否会导致 DataIntegrityViolationException。 这是为了在无法删除时隐藏前端的“删除”按钮。
示例: 我有 A 类和 B 类:
@Entity
public class A{
@Id
private UUID id;
@Column
private String name;
@ManyToMany
private Set<B> bs= new HashSet<>();
//getter, setter, equals,...
}
@Entity
public class B{
@Id
private UUID id;
@Column
private String name;
//getter, setter, equals,...
}
现在,如果我想删除任何 A 对象集中的 B 对象,我将得到“DataIntegrityViolationException”。当然,因为对象正在积极用作键。
我想先检查 A,看看是否有任何引用,我可以安全地删除我的 B 实例。但实际上这可能有点棘手,因为不止一个类可以使用 B 类,而其他类将由不熟悉代码的其他人稍后添加。还有这个……
aRepository.findAll(Example.of(new A(null, null, new HashSet<>(Array.asList(b))));
结果只交付了绝对垃圾(>20 多个对象用于 a b 无处使用)。
第二个想法是尝试这样的事情:
@Transactional //always roll back
public void inUse(B b) throws TransacationException{
bRepository.delete(composition);
throw new TransacationException();
}
然后像这样检查它:
public Boolean deleteAble(B b){
try{
inUse(b);
} catch (DataIntegrityViolationException e){
return false; // constraint violation --> in use!
} catch (TransacationException e){
return true;
}
}
不幸的是,这些方法似乎都不起作用。 你知道如何解决这个问题吗?
【问题讨论】:
-
多对多意味着有一个中间表,其中类型 A 的 id 由 B 类型的 id 引用。简单检查此表中是否存在 id 将确定数据有引用,因此不能被删除。
-
这个表当然存在,但完全由 Spring Data 管理,我真的不知道无需手动实现即可访问此表的好方法。这也不包括我不知道的实体可能引用我的情况。
-
这可能也有帮助 - stackoverflow.com/questions/2109476/…
标签: java spring spring-data-jpa