【发布时间】:2018-05-25 08:50:32
【问题描述】:
我有一个不允许删除记录的项目。相反,我们通过更新 db 中的列(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 也被软删除。
有没有办法做到这一点?我正在使用弹簧数据 jpa。如果需要,请随时询问更多详细信息。
【问题讨论】:
标签: java spring spring-boot jpa spring-data-jpa