Как переопределить метод delete на CrudRepository данных Spring?

у меня есть некоторые объекты, которые я не могу удалить, и должен обновить общее поле с именем "удалено" вместо него. Я читаю здесь что я могу писать общие запросы, используя #{#entityName}. По этой причине я попытался переопределить CrudRepository#delete(…) способ такой:

public interface DeleteableRepository<T, ID extends Serializable> extends CrudRepository<T,ID>{

    @Override
    @Query("UPDATE #{#entityName} x set x.deleted = 1 where x.id = ?1")
    public void delete(ID id);
}

но у меня есть модульный тест, который показывает мне неправильно!

@Test
public void testDelete() {

    SomeDeleteableObject sdo = new SomeDeletableObject();
    sdo = getDeleteableRepository().create(sdo);

    Assert.assertNotNull(sdo);
    Assert.assertNotNull(sdo.getId());
    Assert.assertFalse(sdo.isDeleted());
    getDeleteableRepository().delete(sdo);

    sdo = getDeleteableRepository().findOne(sdo.getId());
    //Fails here

}

разве невозможно переопределить CrudRepository такие методы?

1 ответов


для изменения запросов необходимо добавить @Modifying методу.

убедитесь, что вы знаете о побочных эффектах выбранного вами подхода:

  • выполнение манипулирующего запроса в значительной степени обходит все EntityManager кэш. Таким образом, последующее findOne(…) может / все равно вернет старый экземпляр объекта, который вы пытались удалить, если EntityManager уже зарядил его. Чтобы предотвратить это, установите clearAutomatically флаг @Modifying до true но имейте в виду, что это приведет к уничтожению всех ожидающих изменений.
  • для обработки данных на основе запросов нет обратные вызовы жизненного цикла будут запущены и нет каскады будут запускаться на уровне контекста персистентности. Это означает, что слушатели сущностей слушают @PreUpdate событие не будет получать уведомления. Также любые каскадные операции