Как мягко удалить родителя и ребенка вместе (каскадом) с помощью весенней загрузки с jpa - PullRequest
0 голосов
/ 25 мая 2018

У меня есть проект, в котором мне запрещено удалять записи.Вместо этого мы мягко удаляем их, обновляя столбец (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

BaseRepo, который расширяют все CrudRepos:

    @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 помечен буквой Y. Однако мне бы хотелось, чтобы все связанные с ним SomeChildTable также были удалены программным способом.

Есть ли способ добиться этого?Я использую данные весны jpa.Не стесняйтесь спрашивать более подробную информацию, если требуется.

1 Ответ

0 голосов
/ 25 мая 2018

Мягкое удаление не распространяется, поскольку оно не является одним из методов репозитория по умолчанию.Вы можете проверить интерфейс здесь:

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 () является методом по умолчанию, который должен вызываться в коде, и он должен иметь поведение по умолчанию.В противном случае где-нибудь в коде люди будут писать delete () по привычке вместо softDelete (), и у вас будут проблемы.

Также есть эта аннотация, которая работает с hibernate на классе сущности.

@SQLDelete(sql = “UPDATE table SET deleteFlag= ‘Y’ WHERE id = ?”)

Я не уверен в точном синтаксисе, но он отменяет удаление по умолчанию.Я не уверен, что это часть весны JPA, хотя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...