개체가 존재하지 않는 경우 Springdata-repository의 삭제 방법에 예외를 두지 않도록 하려면 어떻게 해야 합니까?
저는 SpringData의 저장소를 사용하고 있습니다.존재하지 않거나 존재하지 않는 ID를 통해 엔티티를 삭제하려고 하면 예외가 발생합니다.삭제하기 전에 엔터티가 존재하는지 확인하고 싶지 않기 때문에 조용히 실패하는 것이 좋을 것 같습니다.이는 관찰 가능한 동작이 동일하기 때문에 더 쉽게 만들 수 있습니다. 즉, 통화 후에는 개체가 더 이상 존재하지 않습니다.삭제된 적이 있건 없건 상관없습니다.
할 이 을 이 을 할 delete(EntityId)만약 실체가 존재하지 않는다면 예외를 두지 않을 것입니다.
SpringData의 삭제 문서에는 엔티티가 존재하지 않으면 예외가 발생한다고 나와 있습니다.
업데이트된 답변(하향 투표 후)
답변틀렸습니다: 에 대한 언급이 을 미쳤습니다. 질문에 대한 제 이해는 또한 다음에 대한 누락된 참조에 의해 영향을 받았습니다.EmptyResultDataAccessException(애드리안 베이커가 그의 논평에서 보고한 바와 같이) 공식 자바Doc에서.
따라서 이 문제에 대한 더 나은 해결책은 야마시로 리온이 제안한 것일 수 있습니다.
if (repository.existsById(entityId)) {
repository.deleteById(entityId);
}
또는 이것(없는)if 아마 성능이 더 이 입니다 입니다 이
repository.findById(entityId)
.map(repository::delete)
원래(오답) 답변
ㅇㅇIllegalArgumentException된 인수entity,된수 (id, entity, entity)우다인e다feld수()(dtIterable<T>)은 null이며 엔티티가 존재하지 않는 경우에는 null입니다.
만약 당신이 피할 필요가 있다면,IllegalArgumentException다음을 확인하는 사용자 지정 삭제 방법을 구현할 수 있습니다.id != null:
public void customDelete(ID id) {
if(id != null){
this.delete(id);
}
}
"Spring Data Repository에 대한 사용자 정의 구현"을 추가하는 방법을 모르는 경우 이 문서 섹션을 살펴보십시오.
더 적은 코드를 필요로 하는 실행 가능한 솔루션은 다음과 같이 저장소 인터페이스에 새로운 메서드를 추가하는 것입니다.
// @Modifying is necessary depending on your version of Spring
@Modifying
@Query(nativeQuery=true, value="DELETE FROM MY_TABLE WHERE ID = ?1")
public void deleteById(IdPrimitiveType id);`
--> 기본 ID 유형보다 복잡한 ID 유형(int, long, String, ...)을 허용하기 위해 네이티브 SQL 대신 JPQL과 함께 사용할 수 있는지 테스트합니다.
유형 에서 하여 를 해야 을 해야 에서 를 을 하여 Integer:
Integer deleteMyEntityById(Long id);
삭제할 엔터티가 없는 경우 메소드는 엔터티가 삭제된 경우 0 또는 1을 반환합니다.
매우 간단한 솔루션: 추가All메소드 이름으로
사용하다void deleteAllById(ID id)에 대신에delete(ID) or deleteById(ID).
이 방법은 자체적으로 정의해야 합니다. 스프링이 내장된 것이 아닙니다.CRUDRepository.
이 솔루션은 효과가 있지만 이 솔루션이 스프링 데이터 사양을 준수하는지 여부는 주석을 보고 직접 판단하십시오.
와 함께JpaRepository엔터티가 존재하는 경우 쉽게 삭제할 수 있습니다.이 예에서는PostsRepository확장된JpaRepository:
if (postsRepository.existsById(postId)) {
postsRepository.deleteById(postId);
}
메서드를 재정의합니다.
@Transactional
@Override
public void delete(ID id) {
T entity = findOne(id);
if (entity == null) {
//do something instead of throwing exception ex:
//syso entity does not exist ; return;
}
em.remove(em.merge(entity));
}
@SQLDelete 주석을 사용하여 기본 Hibernate DELETE 메서드를 재정의하고 Exception(예외) 던지기를 억제했습니다.
@javax.persistence.Entity
@Table(name = "mytable")
@Proxy(lazy = false)
@SQLDelete(
sql =
"DELETE FROM mytable " +
"WHERE my_id = ?"
)
public class MyTable {
@javax.persistence.Column(name = "my_id", nullable = false)
@Id
private Long id;
...
}
hibernate는 준비된 문장의 '?'를 테이블의 SQL 필드 'my_id'에 매핑된 MyTable 객체의 실제 ID로 자동 대체합니다.
이 경우 테이블의 레코드가 존재하지 않는 경우 예외가 발생하지 않으며 일반 SQL DELETE 쿼리에서처럼 0개의 행만 자동으로 삭제합니다.
개체를 찾을 수 없는 경우 의미 있는 예외를 적용하기 위해 bellow 메서드를 사용했습니다.
if (postsRepository.existsById(postId)) {
throw new EntityNotFoundExceptionById("Invlaid Id was provided");
}
postsRepository.deleteById(postId);
엔티티를 찾을 수 없음 예외 ById 클래스
@ResponseStatus(HttpStatus.NOT_FOUND)
public class EntityNotFoundExceptionById extends RuntimeException {
public EntityNotFoundExceptionById(String message) {
super(message);
}
}
사용하다
repository.deleteAllByIdInBatch(ids);
그것은 다음과 같은 방식으로 작동하고 있습니다.
repository.deleteAllById(ids);
하지만 예외 없이 그것은iddb에 없습니다.
ID 하나로 삭제만 하면 되는 경우에는 이렇게 할 수 있습니다.
if(repsoitory.existsById(id)){
repository.deleteById(id)
}
java 8로 할 수 있는 것을 삭제할 ids 목록이 있다면
List<Long> ids=new ArrayList<>();
ids.stream().filter(id->repository.existsById(id))
.forEach(id->repository.deleteById(id));
언급URL : https://stackoverflow.com/questions/38785622/how-to-i-tell-a-springdata-repositorys-delete-method-to-not-throw-an-exception
'programing' 카테고리의 다른 글
| LISTAGG with ORDER BY NULL이 실제로 주문 기준으로 사용하는 것은? (0) | 2023.09.16 |
|---|---|
| DIV를 선택할 수 없게 만드는 방법이 있습니까? (0) | 2023.09.16 |
| Android에서 다시 로드 작업 (0) | 2023.09.16 |
| Wordpress - 모든 사용자로부터 최신 사용자 지정 게시물 가져오기 (0) | 2023.09.16 |
| ColorStateList를 프로그래밍 방식으로 만들려면 어떻게 해야 합니까? (0) | 2023.09.16 |