카테고리 없음

테스트 JpaRepository findById가 UUID에 대해 null을 반환합니다.

기록만이살길 2021. 2. 25. 00:11
반응형

테스트 JpaRepository findById가 UUID에 대해 null을 반환합니다.

1. 질문(문제점):

여기 Spring 초보자, 저장소
findById()방법 을 테스트하고 싶지만 데이터베이스에 저장되어 있고 존재하더라도 항목을 찾을 수 없습니다.

@DataJpaTest
class CustomerRepoIntegration {

    @Autowired
    CustomerRepo customerRepo;

    @Test
    @Transactional
    void findById() {
        UUID uuid = UUID.randomUUID();
        Customer customer = new Customer(uuid);
        customerRepo.save(customer);

        List<Customer> allCustomers = customerRepo.findAll();
        assertEquals(1, allCustomers.size());

        Optional<Customer> foundCustomer = customerRepo.findById(uuid);
        assertTrue(foundCustomer.isPresent());
    }
}

첫 번째 주장이 성공하는 동안 두 번째 주장은 다음과 같이 실패합니다.

Error:  Failures: 
Error:    CustomerRepoIntegration.findById:32 expected: <true> but was: <false>

나머지 코드 :

// CustomerRepo.java
public interface CustomerRepo extends JpaRepository<Customer, UUID> {}
// Customer.java
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Customer implements Serializable {
    @Id
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(
            name = "UUID",
            strategy = "org.hibernate.id.UUIDGenerator"
    )
    private UUID id;
}

또한 여기에서 복제 저장소를 만들었습니다 : https://github.com/ofhouse/stackoverflow-65818312

2. 해결방안:

사용해보십시오

customerRepo.saveAndFlush(customer) 대신 save(customer)

또한 ID 자동 생성을 담당하는 엔티티 주석을 구성한 경우이 메커니즘을 방해하지 않고 고유 한 UUID를 만들고 엔티티를 초기화하는 것이 더 좋습니다. Hibernate가 자동으로 수행합니다.

왜 안돼?

Hibernate는 @IdEntityManager와 엔티티를 병합하거나 유지할지 주석이 있는 표시된 필드에 따라 자체 메커니즘을 가지고 있습니다 (필드가 null이거나 데이터를 포함하는 경우).

대신에

UUID uuid = UUID.randomUUID();
Customer customer = new Customer(uuid);

당신은 단순히 할 수 있습니다

Customer customer = new Customer();

그리고 여기에 엔티티의 지속 된 인스턴스에서 UUID를 가져옵니다.

var persistedCustomer = customerRepo.saveAndFlush(customer);
...
Optional<Customer> foundCustomer = customerRepo.findById(persistedCustomer.uuid);
65818312
반응형