Изменение сгенерированного имени внешнего ключа в спящем режиме
@OneToOne()
@JoinColumn(name="vehicle_id", referencedColumnName="vehicleId")
public Vehicle getVehicle() {
return vehicle;
}
В моем классе UserDetails есть сопоставление "один к одному" с классом класса Entityity. Hibernate
создает 2 таблицы и назначает общий внешний ключ, который сопоставляет столбец vehicle_id (таблица UserDetails.) с основным ключом VehicleId (таблица транспортных средств).
KEY FKB7C889CEAF42C7A1 (vehicle_id),
CONSTRAINT FKB7C889CEAF42C7A1 FOREIGN KEY (vehicle_id) REFERENCES vehicle (vehicleId)
Мой вопрос: как мы можем изменить этот сгенерированный внешний ключ, что-то значимое, например Fk_userdetails_vehicle.
Ответы
Ответ 1
С JPA 2.1 вы можете использовать @javax.persistence.ForeignKey аннотация:
@OneToOne()
@JoinColumn(name="vehicle_id", referencedColumnName="vehicleId", [email protected](name = "Fk_userdetails_vehicle"))
public Vehicle getVehicle() {
return vehicle;
}
До JPA 2.1 вы можете использовать аннотацию Hibernates @org.hibernate.annotations.ForeignKey, но это теперь устарело:
@OneToOne()
@JoinColumn(name="vehicle_id", referencedColumnName="vehicleId")
@ForeignKey(name="Fk_userdetails_vehicle")
public Vehicle getVehicle() {
return vehicle;
}
Ответ 2
Также вы можете использовать @ForeignKey
встроенный в @JoinColumn
следующим образом:
@JoinColumn(name = "BAR_ID", foreignKey = @ForeignKey(name = FK_BAR_OF_FOO))
для @ManyToMany
отношений вы можете использовать foreignKey
и inverseForeignKey
встроенные в @JoinTable
следующим образом:
@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"))
Ответ 3
Вы можете сделать это, выполнив ImplicitNamingStrategy.determineForeignKeyName
и используя
configuration.setImplicitNamingStrategy(
new MyImplicitNamingStrategy())
что приятно, так как вам не нужно делать это вручную снова и снова. Однако, может быть, трудно разместить соответствующую информацию. Я попытался выполнить все, что я получил (используя три подчеркивания для разделения частей) и закончил с
FK_ACCESS_TEMPLATE____TEMPLATE____TEMPLATE_ID____TEMPLATE_ID__INDEX_B
что на самом деле не лучше, чем
FKG2JM5OO91HT64EWUACF7TJCFN_INDEX_B
Я думаю, использование только названных имен таблиц и столбцов вместе с числом для уникальности было бы просто отлично.
Заметьте также, что это похоже на устаревший материал Hibernate, неподдерживаемый JPA.
OTOH работает с Hibernate 5.0.1 (всего одна неделя).
Ответ 4
Возможно, вам стоит попробовать, добавив @ForeignKey
аннотацию:
@ManyToOne
@ForeignKey(name="FK_some_model")
@JoinColumn(name="some_model_id")
private SomeModel someModel