2012-11-07 3 views
5

Mam obecnie problem z mapowaniem istniejącego schematu db do podmiotów jpa, a wśród wielu dziwactw, utknąłem na ten problem.Czy jest możliwe, aby kolumna dyskryminatora w tabeli wtórnej w jpa

Mam dwie tabele, podobne do tego:

Table 1   Table 2   
|Service  | |Servicetype  | 
|servicetype | |Servicecategory | 
|   | |    | 

Gdzie servicetype w tabeli 1 jest klucz obcy do typu usługi w tabeli dwa. Jednak usługi w tabeli 1 mają bardzo różne zachowanie w zależności od kategorii, do której należą (podczas gdy istnieje ponad 100 typów usług, są tylko 4 kategorie). Chciałbym być w stanie zmapować tabelę 1 do cztery różne kategorie uprawnień, w zależności od kategorii ich rodzaju usług.

To, co mam tak daleko:

@Entity 
@Table(name = "table1") 
@DiscriminatorColumn(name = "servicecategory", discriminatorType =   
    discriminatorType.INTEGER) 
@DiscriminatorValue("1") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@SecondaryTable(name = "table2", 
pkJoinColumns = 
@PrimaryKeyJoinColumn(name = "servicetype", referencedColumnName = 
"servicetype")) 
public class AbstractService implements Serializable { 
...etc 

i 4 zajęcia rozciągające się od tego, Buth z innym discriminatorvalue, co nie działa, ponieważ EclipseLink, których używam, próbuje odnośnika wartość servicecategory w table1.

Czy można wyrazić takie mapowanie za pomocą jpa, czy też powinienem wykonać mapowanie z "where servicecategory = ?" dla każdego zapytania.

+0

Czy próbowałeś podać nazwę tabeli i kolumny w definicji? "table2.servicecategory" – Chris

+0

W adnotacji discriminatorcolumn? Tak. Ale wygenerowana kwerenda już określa tabelę przez alias, więc po prostu staje się $ tablealias.table2.servicecategory – vruum

Odpowiedz

1

Proszę zgłoś ulepszenie w EclipseLink, aby dodać obsługę tej funkcji. Rozwiązaniem JPA byłoby przełączenie tabeli podstawowej z tabelą pomocniczą - może to jednak powodować problemy z zamówieniem na umieszczenie, a klucze obce będą odwoływać się do typu Servicetype w tabeli2.

Specyficznym rozwiązaniem EclipseLink jest użycie dostosowywacza do zmiany tabeli używanej w polu deskryptora. Dodaj znacznik @Customizer do encji i określ klasę za pomocą metody:

public void customize(ClassDescriptor descriptor) { 
    descriptor.getInheritancePolicy().getClassIndicatorField().setTable(
     descriptor.getTable("table2")); 
} 
+1

dzięki za odpowiedź. Tag '@ Customizer' wygląda na bardzo przydatny, ale staramy się trzymać ze standardem, po tym jak już przełączyliśmy się ze stanu hibernacji i zostałemy ukąszeni przez specyfikę dostawcy. Na przyszły użytek, skończyłem właśnie tworząc widok z połączoną servicecategory i osobno zajmując się wstawianiem, ponieważ jest to głównie tabela tylko do odczytu. – vruum

Powiązane problemy