Mam wymóg, w którym wiele moich podmiotów potrzebuje wartości Long i relacji @ManyToOne z inną jednostką. Wymóg ten można łatwo osiągnąć z MappedSuperclass w następujący sposób:Definiuj @UniqueConstraint w @MappedSuperclass
@MappedSuperclass
public class BaseEntity {
@Column(name = "value", nullable = false)
private Long value;
@JoinColumn(name = "some_entity_id", nullable = false)
@ManyToOne(fetch = FetchType.EAGER)
private SomeEntity some;
Problemem jest to, że długo wartość a połączenie jednostka musi być unikalna. Czy możliwe jest zdefiniowanie indeksu w nadklasie? Gdybym zdefiniować indeks w @Table Jednostki kod działa zgodnie z oczekiwaniami
@UniqueConstraint(name = "uq1", columnNames = {"value", "some_entity_id"})
Porażka jest to, że ograniczenie to wtedy muszą być replikowane wzdłuż wszystkich klasach podrzędnych i następnie wszelkie zmiany również muszą być Podsumowując, pozostawiając dziedziczenie prawie bezużyteczne (zdecydowanie nie tak eleganckie)
Podsumowując prawdziwe pytanie brzmi: czy możliwe jest zdefiniowanie złożonego unikalnego ograniczenia z klasy @MappedSuperclass? Jeśli odpowiedź brzmi NIE, to co byś zrobił?
PS: Wiem, że to wszystko ma znaczenie tylko wtedy, gdy generowanie tabel działa, jest częścią naszej polityki kodowania i najlepszych praktyk.
Co zrobisz, jeśli dokonasz abstrakcji BaseEntity, przełączysz się na adnotacje getter/setter i zdefiniujesz abstrakcyjną metodę getId? –