2016-06-30 13 views
0

Ich habe versucht, eine Antwort zu finden, aber leider ohne Glück.JPA - Wie modelliere ich diese Verbindung mit Bedingungen?

Die Datenstruktur sieht wie folgt aus:

  • TABLE_X - enthält userId, auch usertype sagen, wenn diese externe oder interne Benutzer ist
  • INTERNAL_USERS - enthält Schlüssel userId
  • EXTERNAL_USERS - auch enthält Taste userId

TABLE_X.userId ist ei ther INTERNAL_USERS.userId oder EXTERNAL_USERS.userId.

Jetzt möchte ich eine Entität aus TABLE_X zuordnen und Benutzerobjekt der richtigen Entität zugeordnet haben, entweder INTERNAL_USERS oder EXTERNAL_USERS. Wie soll ich das machen?

Sollte ich zwei Felder erstellen und eins zu INTERNAL_USERS und eins zwei EXTERNAL_USERS zuordnen und nur sehen, welches nicht leer ist?

Antwort

0

Wenn ich das richtig verstehe Ihre Frage, was Sie tun müssen, ist Struktur der TABLE_X Spalten mit Feldern auf der TABLE_X Klasse zu replizieren, und

auf Felder ein für INTERNAL_USERS.userID und eine für EXTERNAL_USERS.userID hinzufügen Aber wenn Sie auf TABLE_X.userType speichern, wenn ein Benutzer intern oder extern ist, denke ich, dass Sie keine andere Tabelle erstellen können, weil Sie nur die Informationen haben, die Sie für Ihre erste Tabelle benötigen (TABLE_X). Wenn Sie beispielsweise alle internen Benutzer kennen möchten, führen Sie einfach einen SQL aus und wählen Sie alle Werte aus TABLE_X aus, wobei userType = "Internal"

0

die Tabellenstruktur gegeben, können Sie JPA Vererbung verwenden, wie hier beschrieben:

https://en.wikibooks.org/wiki/Java_Persistence/Inheritance#Example_joined_inheritance_annotations

In Hibernate können Sie solche Beziehungen Modell wie folgt. Wenn Sie nach einem Benutzer suchen, können Sie sich darauf verlassen, dass Hibernate eine Instanz des richtigen Typs zurückgibt.

@Entity 
@Inheritance(strategy=InheritanceType.JOINED) 
public class User{ 

    @Id 
    private Long userId; 
} 

@Entity 
public class InternalUser extends User{ 


} 

@Entity 
public class ExternalUser extends User{ 


} 

Wie in dem Artikel darauf hingewiesen, verbunden, Hibernate benötigt keine Unterscheidungs ​​Spalte angegeben werden, wenn sie verbunden sind Vererbung. Es unterstützt jedoch eine Diskriminatorspalte, wenn eine verfügbar ist. Wie Sie in Ihrem Schema - userType - verfügbar haben, können Sie dies bei Bedarf explizit angeben. Ich stelle mir die einige Performance-Vorteile in Bezug auf den generierten SQL ergeben würde:

Mappings mit optionalen Scheidungs ​​Säule:

@Entity 
@Inheritance(strategy=InheritanceType.JOINED) 
@DiscriminatorColumn(name="userType") 
public class User{ 

    @Id 
    private Long userId; 
} 

@Entity 
@DiscriminatorValue("INT") 
public class InternalUser extends User{ 


} 

@Entity 
@DiscriminatorValue("EXT") 
public class ExternalUser extends User{ 


}