Czemu JPA nie wyrzuca błędu przy ponownej próbie zapisu obiektu z tym samym id?

0

Gdy próbuję zapisać obiekt z kolumną (unique = true) o wartości takiej samej jaka jest już w bazie to dostaję wyjątek:
org.h2.jdbc.JdbcSQLException: Naruszenie ograniczenia Klucza Głównego lub Indeksu Unikalnego: ...

a gdy próbuję zapisać 2 razy tego samego Clienta to, co prawda nie zapisuje się do bazy dwukrotnie, ale nie dostaję żadnego wyjątku.
Jak nakazać JPA wyrzucanie wyjątku w tym przypadku?

    @PostMapping
    @ResponseStatus(code = HttpStatus.CREATED)
    public ClientDto createNewClient(@RequestBody ClientDto clientDto) {
        return clientService.createNewClient(clientDto);
    }
@Entity
public class Client {

    @Id
    @NIP
    @Column(length = 10, updatable = false)
    public final String nip;

// ...

}
@Service
public class ClientServiceImpl implements ClientService {

// ...

@Override
    public ClientDto saveClient(Client client) {
        client = clientRepo.save(client);
        return clientMapper.sourceToDto(client);
    }

    @Override
    public ClientDto createNewClient(ClientDto clientDto) {
        userService.createNewUserIfNoExist(clientDto.getUserDto());
        addressService.createAddressIfNoExist(clientDto.getContactAddress());
        addressService.createAddressIfNoExist(clientDto.getRegisterAddress());
        Client client = clientMapper.dtoToNewSource(clientDto);
        return this.saveClient(client);
    }

// ...

}
0

Pokaż jak zapisujesz za pierwszym i za drugim razem.

1

Kiedy próbujesz zapisać nowy rekord, z kolumną (unique = true) i już gdzieś masz tą wartość, to i tak próbujesz zapisać NOWY rekord, więc naruszasz zasady (nie może być dwóch INNYCH rekordów z tą samą wartością w danej kolumnie).

Natomiast kiedy ta kolumna to twoje @Id, to wstawiając niby nowy rekord z tą samą wartością na kolumnie id, tak naprawdę chodzi ci o istniejący rekord - i wówczas albo nie robi się NIC, albo idzie UPDATE (w zależności którą metodą zapisujesz - jeśli save, to nie robi się nic)

0
Seti87 napisał(a):

Pokaż jak zapisujesz za pierwszym i za drugim razem.

        Client client0 = new Client("3422742010");
        client0.setCompanyName("Restart sp. z o.o.");
        client0.setUser(user0);
        client0.setContactAddress(address0);
        client0.setRegisterAddress(address1);
        clientRepo.save(client0);
        clientRepo.save(client0);
        clientRepo.save(client0);

albo jsonem:

{
    "nip": "9814534686",
    "companyName": "Restart sp. z o.o."
}
Pinek napisał(a):

Kiedy próbujesz zapisać nowy rekord, z kolumną (unique = true) i już gdzieś masz tą wartość, to i tak próbujesz zapisać NOWY rekord, więc naruszasz zasady (nie może być dwóch INNYCH rekordów z tą samą wartością w danej kolumnie).

Natomiast kiedy ta kolumna to twoje @Id, to wstawiając niby nowy rekord z tą samą wartością na kolumnie id, tak naprawdę chodzi ci o istniejący rekord - i wówczas albo nie robi się NIC, albo idzie UPDATE (w zależności którą metodą zapisujesz - jeśli save, to nie robi się nic)

Pinku, czyli nie pozostaje nic innego jak samemu dopisać sprawdzanie czy id już istnieje + wyjątek?

1
Julian_ napisał(a):

Pinku, czyli nie pozostaje nic innego jak samemu dopisać sprawdzanie czy id już istnieje + wyjątek?

Tak, coś w tym stylu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0