web-dev-qa-db-fra.com

Changer le nom généré d'une clé étrangère dans Hibernate

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

Ma classe UserDetails a un mappage un-à-un avec la classe Entitity Vehicle. Hibernate crée les 2 tables et affecte une clé étrangère générique, qui mappe la colonne vehicle_id (table UserDetails.) à la clé primaire vehicleId (table Vehicle).

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

Ma question est la suivante: comment pouvons-nous transformer cette clé étrangère générée en quelque chose de significatif, comme Fk_userdetails_vehicle, par exemple.

20
yovan786

Depuis JPA 2.1, vous pouvez utiliser le @ javax.persistence.ForeignKey annotation:

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

Avant JPA 2.1, vous pouviez utiliser @ org.hibernate.annotations.ForeignKey annotation de Hibernate, mais il est maintenant obsolète:

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

Aussi, vous pouvez utiliser @ForeignKey intégré dans @JoinColumn comme ceci:

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

pour les relations @ManyToMany vous pouvez utiliser foreignKey et inverseForeignKey incorporés dans @JoinTable comme ceci:

@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

Vous pouvez le faire aussi en implémentant ImplicitNamingStrategy.determineForeignKeyName et en utilisant

configuration.setImplicitNamingStrategy(
    new MyImplicitNamingStrategy())

ce qui est bien, car vous n'avez pas à le faire manuellement encore et encore. Cependant, il peut être difficile de mettre les informations pertinentes ici. J'ai essayé de tout concaténer (en utilisant trois traits de soulignement pour séparer les parties) et je me suis retrouvé avec

FK_ACCESS_TEMPLATE____TEMPLATE____TEMPLATE_ID____TEMPLATE_ID__INDEX_B

qui n'est pas vraiment meilleur que

FKG2JM5OO91HT64EWUACF7TJCFN_INDEX_B

J'imagine qu'utiliser des noms de table et de colonne référencés avec un numéro d'unicité serait très bien.


Notez également que cela semble être du matériel hérité d'Hibernate, non pris en charge par JPA.

OTOH cela fonctionne avec Hibernate 5.0.1 (à peine une semaine).

0
maaartinus