2013-05-15 23 views
14
@OneToOne() 
@JoinColumn(name="vehicle_id", referencedColumnName="vehicleId") 
public Vehicle getVehicle() { 
    return vehicle; 
} 

Meine UserDetails-Klasse verfügt über eine Eins-zu-Eins-Zuordnung mit der Entitätsklasse Fahrzeug. Hibernate erstellt die 2 Tabellen und ordnet einen allgemeinen Fremdschlüssel, der die vehicle_id Spalte abbildet (Userdetails Tabelle.) Auf die Primärschlüssel VehicleID (Vehicle Tabelle).Ändern des generierten Namens eines Fremdschlüssels im Ruhezustand

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

Meine Frage ist: Wie können wir diese erzeugten Fremdschlüssel zu ändern, in etwas Sinnvolles, wie Fk_userdetails_vehicle zum Beispiel.

+0

1.Why tun Sie erzeugten Fremdschlüssel ändern wollen? 2.wenn Sie es manuell ändern, könnte die Frage nach seiner Eindeutigkeit gestellt werden (Sie müssen jeden Tables-Constraint-Schlüssel prüfen und auf Duplizierung prüfen)? –

+2

@Ashok_udhay Da Fehler in Bezug auf Fremdschlüssel normalerweise nur dazu führen, dass der Name des Fremdschlüssels von der Datenbank ausgespuckt wird, gibt die Benennung der Schlüssel einen Kontext dafür, wofür der Schlüssel steht, ohne ihn zuerst in der Datenbank ausfindig zu machen Erstellungsskripte. – Patrick

Antwort

12

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

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

Vor JPA 2.1, Sie @org.hibernate.annotations.ForeignKey Anmerkung des Hibernate verwenden könnte, aber das ist jetzt veraltet:

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

'Die Annotation @ForeignKey ist für diesen Standort nicht erlaubt'. – membersound

+1

Verwenden Sie die Annotation für den Ruhezustands-Fremdschlüssel, verwenden Sie nicht javax.persistence.ForeignKey, dann funktioniert es –

+4

es ist veraltet ... – Shine

-1

Mögest du sein sollte dies versuchen, @ForeignKey hinzufügen Anmerkung:

@ManyToOne 
@ForeignKey(name="FK_some_model") 
@JoinColumn(name="some_model_id") 
private SomeModel someModel 
18

Sie können auch @ForeignKey in @JoinColumn wie diese eingebettet verwenden:

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

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

@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")) 
+0

Thx. Arbeite mit javax.persistence. * – Alexander

+0

Funktioniert nicht für mich (ManyToMany). Hibernate versucht weiterhin, eine FK-Einschränkung mit einem eigenen Namen zu erstellen. – velis

+0

Antwort überarbeitet und bearbeitet –

0

Sie können es auch ImplicitNamingStrategy.determineForeignKeyName durch die Umsetzung und mit

configuration.setImplicitNamingStrategy(
    new MyImplicitNamingStrategy()) 

was ist Schön, weil Sie es nicht immer wieder manuell machen müssen. Es kann jedoch schwierig sein, die relevanten Informationen dort zu platzieren. Ich habe versucht, alles zu verketten Ich habe (drei Striche unter Verwendung der Teile zu trennen) und endete mit

FK_ACCESS_TEMPLATE____TEMPLATE____TEMPLATE_ID____TEMPLATE_ID__INDEX_B 

, die besser als

FKG2JM5OO91HT64EWUACF7TJCFN_INDEX_B 

nicht wirklich glaube ich, nur mit der referenzierten Tabelle und Spaltennamen zusammen mit einer Zahl für die Eindeutigkeit wären in Ordnung.


Beachten Sie auch, dass dies scheint Legacy Hibernate Zeug, nicht von JPA unterstützt.

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

Verwandte Themen