I am using SpringData's repository. If I try to delete an entity via an ID which does not exist or never existed it throws an exception. Since I do not want to check whether the entity exists before I delete it, it would be nice that it would fail silently. It would make it easier because the observable behavior is the same - after the call the entity does not exists anymore. Whether it has been deleted or never existed, I do not care.
Is there a way to modify default behavior of delete(EntityId)
so it won't throw an exception, if entity does not exsist?
Documentation of SpringData's delete says that it will throw an exception if an entity does not exist.
A derived delete query must start with deleteBy, followed by the name of the selection criteria. These criteria must be provided in the method call. The return value, of type long, indicates how many records the method deleted. Persisting and deleting objects in JPA requires a transaction.
Crud Repository doesn't provide methods for implementing pagination and sorting. JpaRepository ties your repositories to the JPA persistence technology so it should be avoided. We should use CrudRepository or PagingAndSortingRepository depending on whether you need sorting and paging or not.
The delete() method is used to delete a single entity which we pass as request data and it is available in CrudRepository interface. The CrudRepository extends Repository interface. In Spring Data JPA Repository is top-level interface in hierarchy.
Updated Answer (after downvotes)
My original answer (below) is actually wrong: my understanding of the question was influenced also by the missing reference to the EmptyResultDataAccessException
in the official JavaDoc (as reported by Adrian Baker in his comment).
So a better solution to this issue could be the one suggested by Yamashiro Rion
if (repository.existsById(entityId)) { repository.deleteById(entityId); }
or this one (without the if
, but probably worse performing):
repository.findById(entityId) .map(repository::delete)
Original (Wrong) Answer
JavaDocs says that an IllegalArgumentException
will be thrown if the provided argument (id, entity, Iterable<T>
) is null and not if entity does not exsits.
If you need to avoid the IllegalArgumentException
you could implement a custom delete method that checks id != null
:
public void customDelete(ID id) { if(id != null){ this.delete(id); } }
Take a look to this docs section if you don't know how to add "Custom implementations for Spring Data repositories"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With