Ассоциация отдыха данных Spring GET Override - PullRequest
0 голосов
/ 01 марта 2019

Хорошо, ответ на этот вопрос может быть в весенних документах здесь или здесь , но я не смог его найти.Я пытаюсь реализовать soft-delete.и до сих пор все работает отлично и денди.За исключением случаев, когда я получаю записи по ассоциации.

пример: http://localhost:8080/api/accounts возвращает правильный список учетных записей (без отображения учетных записей, где is_deleted = true)

и http://localhost:8080/api/addresses возвращает надлежащий списокадреса (без указания адресов, где is_deleted = true)

, но когда я нажимаю http://localhost:8080/api/accounts/3c84cdb1-6a01-4364-a60b-305afc521440/addresses, я получаю список всех адресов.даже те, где is_deleted = true

, вот мой пользовательский baseRepository:


@NoRepositoryBean
public interface BaseRepository<T extends BaseEntity, ID> extends JpaRepository<T,ID>{
    void obliterateEntity(T entity);


    @Override
    @Transactional(readOnly = true)
    @Query("select e from #{#entityName} e where e.isDeleted = false")
    Page<T> findAll(Pageable pageable);

    @Override
    @Transactional(readOnly = true)
    @RestResource(exported=false)
    @Query("select e from #{#entityName} e where e.isDeleted = false")
    List<T> findAll(Sort var1);

    @Override
    @Transactional(readOnly = true)
    @RestResource(exported=false)
    @Query("select e from #{#entityName} e where e.isDeleted = false")
    List<T> findAllById(Iterable<ID> var1);

    @Override
    @Transactional(readOnly = true)
    @RestResource(exported=false)
    @Query("select e from #{#entityName} e where e.isDeleted = false")
    List<T> findAll();

    @Override
    @Transactional(readOnly = true)
    @RestResource(exported=false)
    @Query("select e from #{#entityName} e where e.isDeleted = false and e.id = ?1")
    Optional<T> findById(ID var1);

    @Query("update #{#entityName} e set e.isDeleted=true where e.id = ?1")
    @Transactional
    @Modifying
    void delete(UUID id);

    @Override
    @Transactional
    default void delete(T entity) {
        delete(entity.getId());
    }
}

ВОПРОС: Какой метод (ы) мне нужно переопределить для фильтрацииудаленные записи при получении через ссылки на ассоциации?

ps Я также попытался сделать это вместо переопределения функций:

@SQLDelete(sql =
        "UPDATE address " +
                "SET is_deleted = true " +
                "WHERE id = ?")
@Loader(namedQuery = "findAddressById")
@NamedQuery(name= "findAddressById", query =
        "SELECT add " +
                "FROM Address add " +
                "WHERE " +
                "add.id = ?1 AND " +
                "add.isDeleted = false")
@Where(clause = "is_deleted = false")
public class Address extends BaseEntity {

, но для этого требуется то же самое сделать в каждой отдельной сущности.У этого также есть другие проблемы реализации.

Полагаю, у меня просто проблемы с мягким удалением.Таким образом, любые дополнительные советы будут оценены.

1 Ответ

0 голосов
/ 02 марта 2019

Вам нужно будет добавить @Where в ассоциацию.

public class Account extends BaseEntity {

    @OneToMany
    @Where(clause = "is_deleted = false")
    private Set<Address> addresses;
}

@Where, который вы добавили к Address, будет влиять только на прямую загрузку адресов (и может показаться, чтобыть избыточным, учитывая запросы, которые вы определили для загрузки данных).

См. Раздел 4:

https://www.baeldung.com/hibernate-dynamic-mapping

...