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

Moja klasa UserDetails ma odwzorowanie typu jeden-do-jednego z pojazdem klasy Entitity. Hibernate tworzy 2 tabele i przypisuje ogólny klucz obcy, który odwzorowuje kolumnę vehicle_id (tabela UserDetails.) Na klucz podstawowy vehicleId (tabela pojazdu).Zmiana wygenerowanej nazwy klucza obcego w stanie hibernacji

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

Moje pytanie brzmi: w jaki sposób możemy zmienić tego wygenerowanego klucza obcego, w coś sensownego, jak Fk_userdetails_vehicle na przykład.

+0

1. Dlaczego chcesz zmienić wygenerowane ograniczenie klucza obcego? 2.Jeżeli zmienisz go ręcznie, może pojawić się pytanie o jego wyjątkowość (musisz sprawdzić wszystkie klucze więzów tabel i sprawdzić, czy nie są duplikowane)? –

+2

@Ashok_udhay Ponieważ błędy związane z kluczami obcymi zwykle powodują po prostu nazwę klucza obcego wypluwanego przez bazę danych, nazwy kluczy dają pewien kontekst tego, do czego służy klucz, bez konieczności śledzenia go najpierw w bazie danych skrypty tworzenia. – Patrick

Odpowiedz

12

Od JPA 2.1, można użyć @javax.persistence.ForeignKey adnotacji:

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

Przed JPA 2.1, można użyć Hibernate @org.hibernate.annotations.ForeignKey adnotacji, ale to jest teraz przestarzała:

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

"Adnotacja @ForeignKey jest niedozwolona dla tej lokalizacji". – membersound

+1

użyj adnotacji klucza obcego hibernacji, nie używaj javax.persistence.ForeignKey, następnie działa –

+4

jest przestarzały ... – Shine

-1

Może być ty Spróbuj tego, dodając adnotację:

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

Również można użyć @ForeignKey osadzone w @JoinColumn tak:

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

dla @ManyToMany relacji można użyć foreignKey i inverseForeignKey osadzone w @JoinTable tak:

@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. Praca z javax.persistence. * – Alexander

+0

Nie działa dla mnie (ManyToMany). Hibernate nadal próbuje utworzyć ograniczenie FK z własną nazwą. – velis

+0

Odpowiedź poprawiona i edytowana –

0

Można to zrobić także poprzez wdrożenie ImplicitNamingStrategy.determineForeignKeyName i która jest używana:

miło, ponieważ nie musisz robić tego ręcznie ponownie. Jednak może być trudno umieścić tam odpowiednie informacje. Próbowałem Concat wszystko dostałam (stosując trzy podkreślenia do oddzielenia części) i skończyło się

FK_ACCESS_TEMPLATE____TEMPLATE____TEMPLATE_ID____TEMPLATE_ID__INDEX_B 

co nie jest naprawdę lepiej niż

FKG2JM5OO91HT64EWUACF7TJCFN_INDEX_B 

Chyba, przy użyciu tylko odwołanie tabeli i nazwy kolumn wraz z numerem dla unikalności byłyby w porządku.


Należy również zauważyć, że jest to starsza wersja rzeczy w stylu Hibernuj, nieobsługiwana przez JPA.

OTOH działa z Hibernate 5.0.1 (tylko jeden tydzień życia).

Powiązane problemy