2013-12-12 13 views
7

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.

+0

Co zrobisz, jeśli dokonasz abstrakcji BaseEntity, przełączysz się na adnotacje getter/setter i zdefiniujesz abstrakcyjną metodę getId? –

Odpowiedz

0

mogę wpisać to wszystko na zewnątrz, czy może po prostu dać Ci link do rozwiązania :)

How to use @UniqueConstraint with single table inheritance (JPA)?

W istocie, nie może przesłonić @Table adnotacji w rozszerzonych klas, jednak można ustaw unikalne ograniczenia w pliku orm.xml (który jest przywoływany z twojego persistence.xml).

Oznacza to, że można dodać unikalne ograniczenie, które zostanie odziedziczone po wszystkich klasach, które rozszerzają klasę podstawową.

Powiązane problemy