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

Mi UserDetails clase tiene un uno-a-uno con la asignación de la Entitity Vehículo de la clase. Hibernate crea el 2 tablas y asigna un genérico Clave externa, que asigna el vehicle_id columna (UserDetails tabla.) la clave primaria vehicleId del Vehículo (tabla).

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

Mi pregunta es : ¿cómo podemos cambiar esto generó clave externa, en algo significativo, como Fk_userdetails_vehicle por ejemplo.

  • Ya que los errores con respecto a claves externas generalmente resultado sólo en el nombre de la clave foránea de ser escupido por la base de datos, nombres de las teclas que le da un poco de contexto de lo que la clave es que sin tener que buscarla en primer lugar en sus scripts de creación de bd.
InformationsquelleAutor yovan786 | 2013-05-15

4 Comentarios

  1. 21

    Desde JPA 2.1, puede utilizar el @javax.la persistencia.ForeignKey anotación:

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

    Antes de JPA 2.1, usted puede usar el modo de Hibernación del @org.hibernate.las anotaciones.ForeignKey anotación, pero esto es ahora en desuso:

    @OneToOne()
    @JoinColumn(name="vehicle_id", referencedColumnName="vehicleId")
    @ForeignKey(name="Fk_userdetails_vehicle")
    public Vehicle getVehicle() {
       return vehicle;
    }
    • The annotation @ForeignKey is disallowed for this location.
    • el uso de la hibernación de clave externa de anotación, no uso javax.la persistencia.ForeignKey, entonces funciona
    • es obsoleto …
    • Esta respuesta se utiliza en desuso, Hibernate-API específica en lugar de la fácilmente disponibles JPA conforme a la API. Probablemente fue bueno en el 2013, pero ahora no es la mejor respuesta ya.
    • cómo generar este @ForeignKey nombre de la base de datos de forma automática utilizando JPA proyecto?
  2. 23

    También puede utilizar @ForeignKey incrustado en @JoinColumn como este:

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

    para @ManyToMany las relaciones que usted puede utilizar foreignKey y inverseForeignKey incrustado en @JoinTable como este:

    @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"))
    • Thx. Trabajo con javax.la persistencia.*
    • No me funciona (ManyToMany). Hibernate todavía intenta crear FK restricción con su propio nombre.
    • Respuesta revisado y editado
    • Esta realidad debería ser aceptada respuesta
    • Esto también funciona para @OneToMany relaciones mediante la intersección de la tabla.
  3. 1

    Usted puede hacerlo también mediante la implementación de ImplicitNamingStrategy.determineForeignKeyName y el uso de

    configuration.setImplicitNamingStrategy(
        new MyImplicitNamingStrategy())

    lo cual es bueno, ya que no tienen que hacerlo de forma manual una y otra vez. Sin embargo, puede ser difícil de poner la información relevante allí. Traté de concat todo lo que tengo (con tres guión bajo para separar las partes) y terminó con

    FK_ACCESS_TEMPLATE____TEMPLATE____TEMPLATE_ID____TEMPLATE_ID__INDEX_B

    que en realidad no es mejor que

    FKG2JM5OO91HT64EWUACF7TJCFN_INDEX_B

    Supongo, utilizando sólo la referencia a nombres de tabla y columna, junto con un número de singularidad estaría muy bien.


    Nota también de que este parece ser el legado de Hibernación cosas, no admitido por JPA.

    OTOH funciona con Hibernate 5.0.1 (a sólo una semana de edad).

  4. -3

    Puede ser que usted debe tratar de esto, la adición de @ForeignKey anotación :

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

Dejar respuesta

Please enter your comment!
Please enter your name here