I've been using spring data rest without any problem but now I have a requirement that when a user performs a DELETE operation on a given entity i.e. DELETE /accounts/<id>
I need to set a flag on the database marking that entity as deleted but i do want to keep the record.
Basically this means that I need to do an UPDATE instead of a DELETE operation in the database. I don't find any way to override the spring behavior for the delete(ID) method.
Some code:
@Entity
@Table(name = "account")
public class Account {
/*
Default value for this field is false but when a receive a
DELETE request for this entity i want to turn this flag
to false instead of deleting the record.
*/
@Column(name = "deleted")
private boolean deleted;
...
}
Account Repository
@RepositoryRestResource
public interface AccountRepository extends JpaRepository<Account, Integer> {
}
Any ideas?
Try to create a custom repository, to see how it would play out
http://docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/html/#repositories.custom-implementations
But delete is not the only place you'll need to change your logic. I see 2 ways to handle the flag requirement:
Have an extra flag in your entity definition, and update it on Delete.
In this case you need to be careful, and rewrite all existing queries, to be sure, that removed entities would not be returned, and keep in mind this separation of results, for all future entities. (Although you can hack SpringData on low level, and append this flag automatically).
Delete entity from original collection and add it to another collection, where entities are stored before complete disposal.
In this case you'll need to have additional logic for managing disposal collections, but this has no implications on query logic. You can integrate with your existing application, by adding entity listener to your JPA definition (http://docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/html/#jpa.auditing)
It's enough that you override delete
method of your @RepositoryRestResource
, like so:
@RepositoryRestResource
public interface ProductRepository extends PagingAndSortingRepository<Product, Long> {
@Modifying
@Query("update Product p set deleted = true where p = :p")
void delete(Product p);
@Query("select p FROM Product p WHERE p.deleted = false")
Page<Product> findAll(Pageable pageable);
}
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