Как переопределить метод 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
событие не будет получать уведомления. Также любые каскадные операции