簡體   English   中英

如何使用Spring Boot和JPA一起軟性刪除父級和子級(級聯)

[英]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。 如果需要,請隨時詢問更多詳細信息。

不傳播軟刪除,因為它不是默認的存儲庫方法之一。 您可以在此處檢查界面:

https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/repository/CrudRepository.html

所以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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM