Spring 数据剩余 - 软删除
Spring Data Rest - Soft Delete
我一直在使用 spring data rest 没有任何问题,但现在我有一个要求,当用户对给定实体执行 DELETE 操作时,即 DELETE /accounts/<id>
我需要设置一个标志在数据库上将该实体标记为已删除,但我确实想保留记录。
基本上这意味着我需要在数据库中执行更新而不是删除操作。我找不到任何方法来覆盖 delete(ID) 方法的 spring 行为。
一些代码:
@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;
...
}
帐户存储库
@RepositoryRestResource
public interface AccountRepository extends JpaRepository<Account, Integer> {
}
有什么想法吗?
我认为首先您应该使用一个接口来仅识别将使用软删除的实体。之后您可以重写 delete 方法。如果实体是该接口的实例,则将 deleted 标志设置为 true 并调用更新,否则调用超级实现。使用 SimpleJpaRepository 而不是 JpaRepository。您可以在此处找到接口 https://github.com/danjee/hibernate-mappings 的示例(Persistent 和 DefaultPersistent)
尝试创建自定义存储库,看看效果如何
但是删除并不是您需要更改逻辑的唯一地方。
我看到两种处理标志要求的方法:
在您的实体定义中有一个额外的标志,并在删除时更新它。
在这种情况下,您需要小心,并重写所有现有查询,以确保不会返回已删除的实体,并记住这种结果分离,用于所有未来的实体。 (尽管您可以在低级别破解 SpringData,并自动附加此标志)。
从原始集合中删除实体并将其添加到另一个集合中,在完全处理之前存储实体。
在这种情况下,您将需要额外的逻辑来管理处置集合,但这对查询逻辑没有影响。您可以通过将 entity listener 添加到您的 JPA 定义 (http://docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/html/#jpa.auditing)
来与您现有的应用程序集成
覆盖 @RepositoryRestResource
的 delete
方法就足够了,就像这样:
@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);
}
@Autowired
private AccountRepository accountRepository;
@Override
public void accountSoftDelete (Long id) {
Optional<Account> account1= accountRepository.findById(id);
account1.get().setDeleted(true);
accountRepository.save(account1.get());
我一直在使用 spring data rest 没有任何问题,但现在我有一个要求,当用户对给定实体执行 DELETE 操作时,即 DELETE /accounts/<id>
我需要设置一个标志在数据库上将该实体标记为已删除,但我确实想保留记录。
基本上这意味着我需要在数据库中执行更新而不是删除操作。我找不到任何方法来覆盖 delete(ID) 方法的 spring 行为。
一些代码:
@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;
...
}
帐户存储库
@RepositoryRestResource
public interface AccountRepository extends JpaRepository<Account, Integer> {
}
有什么想法吗?
我认为首先您应该使用一个接口来仅识别将使用软删除的实体。之后您可以重写 delete 方法。如果实体是该接口的实例,则将 deleted 标志设置为 true 并调用更新,否则调用超级实现。使用 SimpleJpaRepository 而不是 JpaRepository。您可以在此处找到接口 https://github.com/danjee/hibernate-mappings 的示例(Persistent 和 DefaultPersistent)
尝试创建自定义存储库,看看效果如何
但是删除并不是您需要更改逻辑的唯一地方。 我看到两种处理标志要求的方法:
在您的实体定义中有一个额外的标志,并在删除时更新它。
在这种情况下,您需要小心,并重写所有现有查询,以确保不会返回已删除的实体,并记住这种结果分离,用于所有未来的实体。 (尽管您可以在低级别破解 SpringData,并自动附加此标志)。
从原始集合中删除实体并将其添加到另一个集合中,在完全处理之前存储实体。
在这种情况下,您将需要额外的逻辑来管理处置集合,但这对查询逻辑没有影响。您可以通过将 entity listener 添加到您的 JPA 定义 (http://docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/html/#jpa.auditing)
来与您现有的应用程序集成
覆盖 @RepositoryRestResource
的 delete
方法就足够了,就像这样:
@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);
}
@Autowired
private AccountRepository accountRepository;
@Override
public void accountSoftDelete (Long id) {
Optional<Account> account1= accountRepository.findById(id);
account1.get().setDeleted(true);
accountRepository.save(account1.get());