it-swarm.com.de

Ändern des generierten Namens eines Fremdschlüssels im Ruhezustand

@OneToOne()
@JoinColumn(name="vehicle_id", referencedColumnName="vehicleId")
public Vehicle getVehicle() {
    return vehicle;
}

Meine UserDetails-Klasse hat eine Eins-zu-Eins-Zuordnung mit der Entitity-Klasse Vehicle. Hibernate erstellt die 2 Tabellen und weist einen generischen Fremdschlüssel zu, der die vehicle_id-Spalte (UserDetails-Tabelle.) der Primärschlüssel vehicleId (Vehicle-Tabelle) zuordnet.

KEY FKB7C889CEAF42C7A1 (vehicle_id),
CONSTRAINT FKB7C889CEAF42C7A1 FOREIGN KEY (vehicle_id) REFERENCES vehicle (vehicleId)

Meine Frage ist, wie wir diesen generierten Fremdschlüssel in etwas Sinnvolles ändern, wie zum Beispiel Fk_userdetails_vehicle.

20
yovan786

Seit JPA 2.1 können Sie die Annotation @ javax.persistence.ForeignKey verwenden:

@OneToOne()
@JoinColumn(name="vehicle_id", referencedColumnName="vehicleId", [email protected](name = "Fk_userdetails_vehicle"))
public Vehicle getVehicle() {
    return vehicle;
}

Vor JPA 2.1 könnten Sie die Annotation @ org.hibernate.annotations.ForeignKey - von Hibernate verwenden. Diese Annotation ist jetzt jedoch veraltet:

@OneToOne()
@JoinColumn(name="vehicle_id", referencedColumnName="vehicleId")
@ForeignKey(name="Fk_userdetails_vehicle")
public Vehicle getVehicle() {
   return vehicle;
}
19
Etienne Miret

Sie können auch @ForeignKey verwenden, der in @JoinColumn eingebettet ist, wie folgt:

@JoinColumn(name = "BAR_ID", foreignKey = @ForeignKey(name = FK_BAR_OF_FOO))

für @ManyToMany-Beziehungen können Sie foreignKey und inverseForeignKey wie folgt in @JoinTable eingebettet verwenden:

@JoinTable(name = "ARC_EMPLOYEE_OF_BAR"
        , joinColumns = {@JoinColumn(name = "BAR_ID")}
        , inverseJoinColumns = {@JoinColumn(name = "EMPLOYEE_ID")}
        , uniqueConstraints = {@UniqueConstraint(name = "ARC_UK_EMPLOYEE_OF_BAR", columnNames = {"EMPLOYEE_ID", "BAR_ID"})}
        , foreignKey = @ForeignKey(name = "ARC_FK_BAR_OF_EMPLOYEE")
        , inverseForeignKey = @ForeignKey(name = "ARC_FK_EMPLOYEE_OF_BAR"))
21
Mohsen Kashi

Sie können dies auch tun, indem Sie ImplicitNamingStrategy.determineForeignKeyName implementieren und verwenden

configuration.setImplicitNamingStrategy(
    new MyImplicitNamingStrategy())

das ist schön, da man es nicht immer wieder manuell machen muss. Es kann jedoch schwierig sein, die relevanten Informationen dort einzugeben. Ich habe versucht, alles zusammenzufassen, was ich bekam (mit drei Unterstrichen, um die Teile zu trennen) und landete bei

FK_ACCESS_TEMPLATE____TEMPLATE____TEMPLATE_ID____TEMPLATE_ID__INDEX_B

was nicht wirklich besser ist als

FKG2JM5OO91HT64EWUACF7TJCFN_INDEX_B

Ich denke, es wäre gut, wenn man nur die referenzierten Tabellen- und Spaltennamen zusammen mit einer Nummer für die Eindeutigkeit verwendet.


Beachten Sie auch, dass es sich hierbei um ältere Hibernate-Sachen handelt, die von JPA nicht unterstützt werden.

OTOH funktioniert mit Hibernate 5.0.1 (nur eine Woche alt).

0
maaartinus