删除前检查是否违反外键约束

时间:2019-06-04 18:21:48

标签: java spring spring-data-jpa

我正在尝试确定是否可以从存储库中删除对象。换句话说:如果删除将导致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,...
}

现在,如果我要删除B对象(在任何A对象集中),则将得到“ DataIntegrityViolationException”。当然,因为该对象被积极用作键。

我考虑过先检查A,看看是否有任何引用,然后可以安全地删除我的B实例。但是实际上,这可能有点棘手,因为一个以上的类可以使用B类,而其他类稍后会由不熟悉代码的其他人添加。还有这个...

aRepository.findAll(Example.of(new A(null, null, new HashSet<>(Array.asList(b))));

结果仅传送了绝对垃圾(b的20个以上对象无处使用)。

第二个想法是通过尝试这样的事情:

    @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;
        }
    }

不幸的是,这些方法似乎都不起作用。 您对如何解决此问题有任何想法吗?

1 个答案:

答案 0 :(得分:1)

也许您可以使您的@ManyToMany双向关联,例如将其添加到您的课程B中:

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

那只能是:

someB.getAs().isEmpty()