外键 jpa/hibernate 注释不能按预期工作

Posted

技术标签:

【中文标题】外键 jpa/hibernate 注释不能按预期工作【英文标题】:The ForeignKey jpa/hibernate annotation does not work as exptected 【发布时间】:2015-01-22 07:04:20 【问题描述】:

在实体中有两对关联:

import org.hibernate.annotations.ForeignKey;
...
@OneToOne(fetch = FetchType.LAZY, optional = false, targetEntity = UserSettingsEntityBean.class)
@JoinColumn(name = INTEGER_USER_ID)
@ForeignKey(name = "FK_USER_TO_SETTINGS")
private UserSettingsEntity userSettings;

@ManyToOne(targetEntity = DivisionEntityBean.class, optional = true)
@JoinColumn(name = "DIVISION_ID", nullable = true, columnDefinition = "integer")
@ForeignKey(name = "FK_USER_TO_DIVISIOG")
private DivisionEntity division;

Hibernate 为这些 ForeignKey 注释生成以下更新: 正如预期的那样,正确的更新:

alter table users add constraint FK_USER_TO_DIVISIOG foreign key (DIVISION_ID) references division

错误的db更新,注解被忽略(生成约束名):

alter table users add constraint FK_olm1qeb13uc1worutbx1sc22k foreign key (USER_ID) references user_settings

你能解释一下吗?有没有办法在第二种情况下设置约束名称?

更新1:

以下解决方案也不起作用:

@JoinColumn(name = INTEGER_USER_ID, foreignKey = @javax.persistence.ForeignKey(name = "FK_USER_TO_PERS_DATA"))

这个解决方案是针对多对一的,这里是单对一的问题

更新2: unit test to reproduce this issue

【问题讨论】:

How to name the foreign key constraint of ManyToOne references since JPA 2.1?的可能重复 @Vitaly,不,它不是重复的。它是 OneToOne,您的链接中描述的解决方案在这里不起作用。 【参考方案1】:
import javax.persistence.ForeignKey;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne; 

@JoinColumn(updatable = false, nullable = false, foreignKey = @ForeignKey(name = "FK_customerUser_customer" ))
@ManyToOne(optional = false, cascade = CascadeType.DETACH, fetch = FetchType.LAZY)
private Customer customer;

【讨论】:

你的 JPA/Hibernate 的版本是多少? 你是怎么想出这个解决方案的?

以上是关于外键 jpa/hibernate 注释不能按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

在 merge() 操作中丢失复合外键(JPA/Hibernate)

使用 JPA Hibernate 自动保存子对象

外键中的 JPA / Hibernate OneToOne Null

Criteria API JPA Hibernate:外键上的不同选择

JPA / Hibernate - 删除子项删除父项(从同一个表)

Spring-data-jpa + Hibernate 未创建预期表