外键 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 OneToOne Null
Criteria API JPA Hibernate:外键上的不同选择