Изменение сгенерированного имени внешнего ключа в спящем режиме - программирование
Подтвердить что ты не робот

Изменение сгенерированного имени внешнего ключа в спящем режиме

@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.

4b9b3361

Ответ 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