@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.
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;
}
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"))
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).