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
}
@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

Your email address will not be published.


*