Chciałem zastosować podejście z UUID jako dodatkowym polem do identyfikacji unikalności encji na podstawie tej prezentacj(o UUID jest gdzieś od 34 minuty):
Zasadniczo chodzi o to, żeby używać pola UUID zamiast ID w metodach equals i hashCode aby uniknąć problemów z porównywaniem obiektów czy dodawaniu ich do kolekcji.
Mam jednak problem z tym jak prawidłowo zaprojektować DTO do takiej encji i metody equals i hashCode w DTO.
Przykładowo mam taką encję:
@Table("users")
@Entity
public class UserEntity {
@Id
@GeneratedValue
private Long id;
@Column(updatable = false, nullable = false, unique = true)
private UUID uuid= UUID.randomUUID();
private String firstName;
private String lastName;
private String mail;
//gettery i settery
@Override
public boolean equals(Object that) {
return this == that || that instanceof UserEntity
&& Objects.equals(uuid, ((UserEntity ) that).uuid);
}
@Override
public int hashCode() {
return Objects.hashCode(uuid);
}
}
Wszystko wydaje się ok, tylko zastanawia mnie jedna rzecz kiedy inicjalizować to pole UUID? Załóżmy, że mamy serwisy restowe, które służą do prostego CRUDa, do transportu danych służy mi DTO, które jest potem mapowane na encję. Przykładowo takie:
public class UserDto {
private Long id;
private String firstName;
private String lastName;
private String mail;
//gettery oraz builder
}
Jak takie DTO powinno wyglądać, czy powinno w sobie zawierać UUID? Jeśli tak to czy to oznacza, że jeśli tworzę nowy rekord i przesyłam dane z frontu za pomocą mojego UserDto, to dodaję w nim pole UUID i od razu inicializuje przy instancjowaniu obiektu DTO a nie encyjnym? Wtedy musiałbym usunąc inicjalizację w klasie encyjnej i po prostu dodać setter za pomocą którego ustawię wartość UUID z dto.
Jeśli inicjalizacja pola UUID miałaby nadal pozostać w encji to wtedy podczas tworzenia obiektu UUID w DTO byłby nullem. Nie miałoby to jakichś negatywnych skutków? Chodzi mi głownie o metody hashCode i equals w DTO, ponieważ zastanawiam się jak powinny one wyglądać w klasie DTO. Jak je prawidłowo zaprojektować?
Przy pobieraniu danych już nie miałbym tego problemu z UUID bo generujemy go tylko raz, więc zmapowałbym dane z encji na dto i po kłopocie.