在Hibernate中更改外键的生成名称
@OneToOne() @JoinColumn(name="vehicle_id", referencedColumnName="vehicleId") public Vehicle getVehicle() { return vehicle; }
我的UserDetails类与Entitity类Vehicle具有一对一的映射。 Hibernate
创建2个表并分配一个通用的外键,它将vehicle_id列(UserDetails表。)映射到主键vehicleId(Vehicle表)。
KEY FKB7C889CEAF42C7A1 (vehicle_id), CONSTRAINT FKB7C889CEAF42C7A1 FOREIGN KEY (vehicle_id) REFERENCES vehicle (vehicleId)
我的问题是:我们如何将生成的外键更改为有意义的内容,例如Fk_userdetails_vehicle。
从JPA 2.1开始,您可以使用@ javax.persistence.ForeignKey批注:
@OneToOne() @JoinColumn(name="vehicle_id", referencedColumnName="vehicleId", foreignKey=@ForeignKey(name = "Fk_userdetails_vehicle")) public Vehicle getVehicle() { return vehicle; }
在JPA 2.1之前,您可以使用Hibernate的@ org.hibernate.annotations.ForeignKey批注,但现在不推荐使用:
@OneToOne() @JoinColumn(name="vehicle_id", referencedColumnName="vehicleId") @ForeignKey(name="Fk_userdetails_vehicle") public Vehicle getVehicle() { return vehicle; }
你也可以使用@ForeignKey
嵌入的@JoinColumn
如下所示:
@JoinColumn(name = "BAR_ID", foreignKey = @ForeignKey(name = FK_BAR_OF_FOO))
对于@ManyToMany
关系,您可以使用inverseForeignKey
嵌入的foreignKey
和inverseForeignKey
,如下所示:
@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"))
您也可以通过实现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(仅一周)。
也许你应该试试这个,添加@ForeignKey
注释:
@ManyToOne @ForeignKey(name="FK_some_model") @JoinColumn(name="some_model_id") private SomeModel someModel
- 为什么我得到org.hibernate.HibernateException:没有配置CurrentSessionContext
- 缺少序列或表:hibernate_sequence
- 如何使用JPA解决javax.persistence.EntityNotFoundException(而不是使用@NotFound)
- hibernate是否支持count(*)over()
- 在自动触发的默认侦听器之前,激活Hibernate自定义事件侦听器
- @OneToMany和复合主键?
- 使用@ElementCollection映射Set
- Spring + Hibernate不会自动打开会话
- 如何使用hibernate生成Custom Id,同时它必须是表的主键