Soru Hazırda bekletilen bir yabancı anahtarın oluşturulan adını değiştirme


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

UserDetails sınıfım, Entitity sınıfı Araç ile bire bir eşleştirmeye sahiptir. Hibernate 2 tabloyu oluşturur ve araç_konu sütununu (UserDetails tablosu.) birincil anahtar araçId (Araç tablosu) ile eşleyen genel bir Yabancı Anahtar atar.

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

Sorum şu: Bu oluşturulan yabancı anahtarı, örneğin Fk_userdetails_vehicle gibi anlamlı bir şeye nasıl dönüştüreceğiz.


19
2018-05-15 12:16


Menşei


@Ashok_udhay Yabancı anahtarlar ile ilgili hatalar genellikle veritabanı tarafından tükenen yabancı anahtarın ismiyle sonuçlandığından, anahtarların isimlendirilmesi, db oluşturma işleminizde ilk önce bu tuşun izlenmesi gerekmeden anahtarın ne olduğuna dair bir bağlam sağlar. senaryo. - Patrick


Cevaplar:


JPA 2.1'den beri @ javax.persistence.ForeignKey açıklama:

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

JPA 2.1’den önce, Hazırda Beklet’i kullanabilirsiniz. @ org.hibernate.annotations.ForeignKey ek açıklama, ancak şimdi kullanımdan kaldırıldı:

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

18
2018-05-15 12:23



The annotation @ForeignKey is disallowed for this location. - membersound
Hazırda bekletme yabancı anahtar notunu kullanın, javax.persistence.ForeignKey kullanmayın, sonra çalışır - Denis Lukenich
kullanımdan kaldırıldı ... - Shine
Bu yanıt, halihazırda kullanılabilir olan JPA uyumlu API'sı yerine kullanımdan kaldırılmış, Hazırda belirtilen API'yi kullanır. 2013'te muhtemelen iyi oldu, ama şimdi artık en iyi cevap bu değil. - Michael Piefel


Ayrıca kullanabilirsiniz @ForeignKey gömülü @JoinColumn bunun gibi:

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

için @ManyToMany kullanabileceğiniz ilişkiler foreignKey ve inverseForeignKey gömülü @JoinTable bunun gibi:

@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
2018-05-15 10:18



Teşekkürler. Javax.persistence ile çalışın. * - Alexander
Benim için çalışmıyor (ManyToMany). Hazırda bekletme hala kendi adıyla FK kısıtlaması oluşturmaya çalışır. - velis
Yanıtlama ve düzenleme cevabı - Mohsen Kashi
Bu gerçekten kabul edilen cevap olmalı - MTCoster
Bu ayrıca çalışır @OneToMany kesişim tablosunu kullanarak ilişkiler. - ekrich


Bunu yaparak da yapabilirsin ImplicitNamingStrategy.determineForeignKeyName ve kullanarak

configuration.setImplicitNamingStrategy(
    new MyImplicitNamingStrategy())

Bu, el ile tekrar tekrar yapmak zorunda olmadığınız kadar güzel. Ancak, ilgili bilgileri buraya koymak zor olabilir. Elimdeki herşeye (parçaları ayırmak için üç alt çizgi kullanarak) uymaya çalıştım ve

FK_ACCESS_TEMPLATE____TEMPLATE____TEMPLATE_ID____TEMPLATE_ID__INDEX_B

hangisi daha iyi değil

FKG2JM5OO91HT64EWUACF7TJCFN_INDEX_B

Sadece referans verilen tablo ve sütun isimlerini tekil bir sayı ile birlikte kullanarak, sadece iyi olurdu sanırım.


Ayrıca bu, JPA tarafından desteklenmeyen eski hazırda bekleyen şeyler gibi görünüyor.

OTOH, Hibernate 5.0.1 ile çalışır (sadece bir haftalık).


0
2017-09-10 02:23





Bunu denemelisin, ekleyerek @ForeignKey ek açıklama:

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

-3
2018-05-15 12:23