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