![](/img/trans.png)
[英]Soft Delete : Child Entity not being deleted after Deleting parent Entity in @OneToMany relation in Spring Boot JPA Hibernate
[英]How to soft delete parent and child together (cascade) using spring boot with jpa
我有一個不允許刪除記錄的項目。 相反,我們通過更新db在所有實體中都通用的column(deleteFlag)來軟刪除它們。 我正在嘗試以通用方式使用JPA來實現這一目標,如果可能的話,我想要一個JPA解決方案。 deleteFlag是設置為Y或N的軟刪除標志。
我到目前為止編寫的代碼:
所有實體擴展的基類:
@MappedSuperclass
public class BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name = "CREATED_BY_C")
private String createdByC;
@Column(name = "CREATED_DATE_DT", updatable = false, insertable = false)
private Timestamp createdDateDt;
@Column(name = "UPDATE_DATE_DT", updatable = false, insertable = false)
private Timestamp updateDateDt;
@Column(name = "UPDATED_BY_C")
private String updatedByC;
@Column(name = "DELETE_FLG")
private String deleteFlag;
//getters and setters
所有CrudRepos擴展的BaseRepo:
@NoRepositoryBean
public interface BaseCrudRepository<T extends BaseEntity, ID extends Serializable>, CrudRepository<T, ID> {
@Override
@Query("select e from #{#entityName} e where e.deleteFlag !='Y'")
public List<T> findAll();
//Look up deleted entities
@Query("select e from #{#entityName} e where e.deleteFlag ='Y'")
public List<T> recycleBin();
//Soft delete.
@Query("update #{#entityName} e set e.deleteFlag='Y' where e.id=:id")
@Modifying
@Transactional
public void softDelete(@Param("id")Integer id);
}
我要進行軟刪除的示例實體:
@Entity
@Table(name = "SOME_PARENT_TABLE", schema = "SOME_SCHEMA")
public class SomeParentTable extends BaseEntity {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "id_field")
private Integer someParentTableId;
//more fields here
//bi-directional many-to-one association to SomeChildTable
@OneToMany(mappedBy = "sdIncomingTransaction", , cascade=CascadeType.ALL)
private List<SomeChildTable> someChildTables;
所以當我這樣做時:
someParentTableRepository.softDelete(someParentTableId);
只有someParentTable的deleteflag標記為Y。但是,我希望將與其關聯的所有SomeChildTable也都進行軟刪除。
有沒有辦法做到這一點? 我正在使用spring數據jpa。 如果需要,請隨時詢問更多詳細信息。
不傳播軟刪除,因為它不是默認的存儲庫方法之一。 您可以在此處檢查界面:
所以JPA不會傳播它,因為它是一種奇怪的方法,它不是接口的一部分,而Spring對此一無所知。 這就是為什么即使全部級聯也不會傳播的原因。 您應該重寫delete()方法,並使其進行軟刪除以符合該接口。
@Override
@Query("update #{#entityName} e set e.deleteFlag='Y' where e.id=:id")
@Modifying
@Transactional
public void delete(@Param("id")Integer id);
如果需要,則添加硬刪除方法;)這是更好的解決方案,因為delete()是應在代碼中調用的默認方法,並且應具有默認行為。 否則,人們會在代碼中的某些地方按習慣而不是softDelete()編寫delete(),這樣您就會遇到問題。
還有一個注釋,它在實體類上與休眠一起使用。
@SQLDelete(sql = “UPDATE table SET deleteFlag= ‘Y’ WHERE id = ?”)
我不確定確切的語法,但它會覆蓋默認的刪除。 我不確定這是Spring JPA的一部分
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.