Klucz główny – UUID czy @GeneratedValue
Klucz główny – UUID czy @GeneratedValue
@GeneratedValue – adnotacja która określa sposób generowania wartości kluczy głównych (atrybut strategy) – następuje to dopiero przy zapisie encji do bazy danych. Przed zapisem encji do bazy danych wartość pola oznaczonego adnotacjami @Id oraz @GeneratedValue wynosi null. Jest to problemem jeśli metody equals() & hashCode() odnoszą się do pola reprezentującego klucz główny. Zapis obiektu do bazy danych zmienia zachowanie metod equals() & hashCode() co stanowi problem z porównywaniem encji. Rozwiązanie? Generowanie klucza głównego w oparciu o klasę UUID:
@Id UUID id = UUID.randomUUID();
Poniżej abstrakcyjna klasa reprezentująca klucz biznesowy z wykorzystaniem klasy UUID:
@MappedSuperclass public abstract class AbstractBaseEntity implements Serializable { private static final long serialVersionUID = 1L; @Id private String id; public AbstractBaseEntity() { this.id = UUID.randomUUID().toString(); } @Override public int hashCode() { return id.hashCode(); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (!(obj instanceof AbstractBaseEntity)) { return false; } AbstractBaseEntity other = (AbstractBaseEntity) obj; return getId().equals(other.getId()); } // getters & setters } <!--?prettify linenums=true?-->
@Entity public class AbstractBaseEntityExample extends AbstractBaseEntity { }
Wadą tego rozwiązania jest m.in. wydajność bazy danych np. bazy MySQL podczas zapisu nowego obiektu.
Leave a comment