복붙노트

[SPRING] Spring Hibernate 템플릿을 사용할 때 중복을 탐지하는 가장 좋은 방법

SPRING

Spring Hibernate 템플릿을 사용할 때 중복을 탐지하는 가장 좋은 방법

우리는 생성시 특정 필드에서 중복을 감지해야하는 응용 프로그램이 있습니다. Hibernate를 영속 계층으로 사용하고 Spring의 HibernateTemplate을 사용하고있다. 내 질문에 그것을 만들기 전에 항목에 대한 선행 조회를 수행하는 것이 더 나은지 여부 또는 DataIntegrityViolation 예외를 잡으려고 시도하고 이것이 중복 항목에 의해 발생하는 경우 확인하십시오.

해결법

  1. ==============================

    1.그것은 복제를 갖는 것이 예외적 인 시나리오인지 또는 비즈니스 로직의 경우인지에 달려 있습니다. 예를 들어, 등록하는 동안 고유 한 이메일 / 사용자 이름을 확인하는 것은 비즈니스 로직의 경우이며, 확인은 삽입을 시도하기 전에 수행해야합니다

    그것은 복제를 갖는 것이 예외적 인 시나리오인지 또는 비즈니스 로직의 경우인지에 달려 있습니다. 예를 들어, 등록하는 동안 고유 한 이메일 / 사용자 이름을 확인하는 것은 비즈니스 로직의 경우이며, 확인은 삽입을 시도하기 전에 수행해야합니다

    고유 제한 조건으로 정확하게 실패한 필드를 표시해야하는 경우 예외를 포착하는 대신 미리 확인하는 것이 좋습니다. 예외를 포착해도 실패한 중요한 세부 정보는 제공되지 않습니다.

    예외를 기반으로이 정보를 얻을 수있는 방법이 있지만 매우 지루하고 데이터베이스 별입니다 (DB (db 특정)에서 제약 조건 이름 조회, 적용되는 필드 가져 오기, 필드와 일치하는 엔티티 속성)

  2. ==============================

    2.데이터가 데이터베이스에 있는지 확인하는 것이 좋습니다. 데이터가 이미 데이터베이스에 존재하는지 확인하는 쉬운 방법은 클래스가 Hibernate LifeCyle API를 구현하도록하는 것입니다. Hibernate는 저장 전에 식별자가 bean과 관련 지어지면 검증 동작을 수행 할 수있게 해준다. 특정 로직이 위반되거나 실패하면 저장 작업을 거부 할 수 있습니다.

    데이터가 데이터베이스에 있는지 확인하는 것이 좋습니다. 데이터가 이미 데이터베이스에 존재하는지 확인하는 쉬운 방법은 클래스가 Hibernate LifeCyle API를 구현하도록하는 것입니다. Hibernate는 저장 전에 식별자가 bean과 관련 지어지면 검증 동작을 수행 할 수있게 해준다. 특정 로직이 위반되거나 실패하면 저장 작업을 거부 할 수 있습니다.

    public class Bean extends Serializable implements org.hibernate.classic.LifeCycle {
          public boolean onSave(Session s) {
              Query query = session.createQuery(from Bean b where b.field=:field");
              query.setParameters("field", this.field);
              @SuppressWarnings("unchecked")
              List<Bean> beans = query.list();
              if (beans != null && !beans.isEmpty()) {
                  // This does not save the identity.
                  return VETO;
              }
              return NO_VETO;
          }
    }
    
  3. ==============================

    3.나는 확실히 Bozho 대답에 간다. 나는 이것이 정확하게 요점이라고 생각한다. 현재 작업중인 프로젝트 내에 비슷한 문제가 있습니다. 우리는 필터를 기반으로 여러 서버간에 정보를 공유하고 있으며 수신 된 개체가 데이터베이스에 이미 추가되어 PK 예외가 발생할 수있는 시나리오가있을 수 있습니다.

    나는 확실히 Bozho 대답에 간다. 나는 이것이 정확하게 요점이라고 생각한다. 현재 작업중인 프로젝트 내에 비슷한 문제가 있습니다. 우리는 필터를 기반으로 여러 서버간에 정보를 공유하고 있으며 수신 된 개체가 데이터베이스에 이미 추가되어 PK 예외가 발생할 수있는 시나리오가있을 수 있습니다.

    우리의 경우 이러한 PK 충돌은 매우 드물기 때문에이 상황을 예외적 인 것으로 간주합니다. 또한 Spring과 Hibernate를 사용하고 있으며 이러한 우려를 분리하기 위해 Spring 트랜잭션 정의로 인해 AOP를 사용하여 특정 DataIntegrity 예외를 catch하고 필요할 때 무결성 검사를 수행하는 트랜잭션을 재실행합니다. ExceptionHandlerAdvice를 사용하는 데 도움이 필요하면이 부분을 자세히 설명 할 수 있습니다.

  4. from https://stackoverflow.com/questions/2786941/best-way-to-detect-duplicates-when-using-spring-hibernate-template by cc-by-sa and MIT license