3

Ich versuche, eine Vererbung mit TABLE_PER_CLASS Strategie zu erstellen, aber ich möchte verschiedene Primärschlüssel für jede Tabelle haben ist es möglich?Hibernate Vererbung mit anderen Primärschlüssel

Ich habe eine Klasse Register, die Millionen von Instanzen hat, einige dieser Instanzen sind "spezielle" und haben unterschiedliche Regeln für ihre Spalten und zusätzliche Spalten.

@MappedSuperclass 

public abstract class Register { 


    @Id 
    @Column(nullable = false, unique = true, updatable = false) 
    private Long userId; 


    private Date checked; 

    @Column(nullable = false) 
    private RegisterState tipo; 
} 


@Entity 
@AttributeOverrides({ @AttributeOverride(name = "userId", column = @Column(nullable = false, unique = false, updatable = false)) }) 
public class PotencialRegister extends Register implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 


    @Column(length = 64, nullable = false, unique = false) 
    private String referer; 
} 

Für die Grundregister Ich brauche ein ID-Attribut nicht, weil ich eine eindeutige Spalte haben, aber für die spezialisierte Einheit, die Spalte nicht eindeutig zuzuordnen sind, so habe ich ein zusätzliches Attribut.

das Problem, dass Hibernate ist die übergeordnete ID erstellt einen zusammengesetzten Primärschlüssel (das generierte Schema ist):

create table PotencialRegister (
     id integer not null, 
     userId bigint not null, 
     checked datetime(6), 
     tipo integer not null, 
     referer varchar(64) not null, 
     primary key (id, userId) 
    ) 

    create table Register (
     userId bigint not null, 
     checked datetime(6), 
     tipo integer not null, 
     primary key (userId) 
    ) 

Die Säulen sind rechts und die Schama ist, was ich will, aber ich möchte Entfernen des Members "ID" aus dem Primärschlüssel "Po- tivencialRegister".

+0

Werden in der Antwort immer noch Probleme angezeigt? – Ravik

Antwort

6

Sie können eine andere Klasse erstellen, die keine Spalte @Id enthält und diese Klasse als Basisklasse für jeden Registertyp verwenden.

so würde Ihre Register-Klasse wie folgt aussehen:

@MappedSuperclass 

public abstract class Register { 

    @Column(nullable = false, unique = true, updatable = false) 
    private Long userId; 

    private Date checked; 

    @Column(nullable = false) 
    private RegisterState tipo; 
} 

Jetzt für Ihre normale Registrieren Sie wie folgt vorgehen können:

@Entity 
public class NormalRegister extends Register implements Serializable{ 

    @Id 
    public Long getUserId(){ 
     return super.userId; 
    } 

    public void setUserId(Long uId){ 
     super.userId=uId; 
     } 

    } 

nächstes Sie Ihre PotencialRegister Klasse definieren:

@Entity 
@AttributeOverrides({ @AttributeOverride(name = "userId", column = @Column(nullable = false, unique = false, updatable = false)) }) 
public class PotencialRegister extends Register implements Serializable { 

    private Integer id; 


    @Column(length = 64, nullable = false, unique = false) 
    private String referer; 

    @Id 
    public Long getUserId(){ 
     return super.userId; 
    } 

    public void setUserId(Long uId){ 
     super.userId=uId; 
     } 

} 

Damit haben Sie keine ID in der Basisklasse und alle Unterklassen können ihr eigenes Id-Attribut definieren te

+0

Wenn Sie die Antwort hilfreich finden, teilen Sie bitte die Kopfgeldpunkte. Wenn Sie weitere Erläuterungen benötigen, fragen Sie bitte. – Ravik

+0

Eigentlich löst es mein Problem nicht, weil ich nicht die "id" -Spalte haben wollte ... der perfekte Primärschlüssel ist die userId, wenn ich es in die abstrakte Klasse lege, habe ich das Problem, das ich habe, wenn ich abheben und in jede umschlossene Klasse setzen ich bekomme Unvereinbarkeiten –

+0

Ich verstehe, dass Ihr Problem mit PotenicalRegister-Klasse ist, wo mit Ihrer Implementierung ID und userId Spalten Teil des Primärschlüssels werden, da dieser von der abstrakten Klasse geerbt wird. Bei meiner Lösung können Sie den Primärschlüssel so definieren, wie Sie möchten, dass in der abstrakten Klasse kein Primärschlüssel vorhanden ist und jede Implementierung der Registerklasse ihren Primärschlüssel pwn haben kann. – Ravik

1

In der Tabelle pro Klassenhierarchie wird davon ausgegangen, dass sowohl die Versions- als auch die Id-Eigenschaften von der Root-Klasse übernommen werden. Wenn ich nicht falsch liege, können Sie nicht mehrere Id-Attribute in einer einzelnen Klasse/Klassenhierarchie verwenden. In Ihrem Fall in der Basisklasse können Sie die Eigenschaften, die tabellenübergreifend sind, verwenden und das Id-Attribut nur in den spezifischen Klassen verwenden (die die einzelnen Tabellen repräsentieren).

Verwandte Themen