我在使用MySql数据库的JBOSS服务器上运行的JEE6项目中使用Hibernate作为我的ORM。 在我的每个Data元素的项目中都会有detail元素。为此,我创建了与共享主键的双向一对一关系,如下所示。
@Entity
@Table(name="DATA", schema = "TEST")
public class Data implements Serializable {
....
.....
@OneToOne(fetch = FetchType.LAZY, mappedBy = "data", cascade = CascadeType.ALL)
public Details getDetails() {
return details;
....
}
@Entity
@Table(name = "DETAILS", schema = "TEST")
public class Details implements Serializable {
...
...
@GenericGenerator(name = "generator", strategy = "foreign", parameters = { @org.hibernate.annotations.Parameter(name = "property", value = "data") })
@Id
@GeneratedValue(generator = "generator")
@Column(name = "DETAILS_ID", nullable=false)
@Index(name="DETAILS_ID")
@ForeignKey(name = "FK_DATA_ID")
public Long getDetailsId() {
return detailsId;
}
@OneToOne
@PrimaryKeyJoinColumn(name = "DETAILS_ID", referencedColumnName = "DATA_ID")
public Data getData() {
return data;
}
...
}
即使在提到@ForeignKey之后,它也会生成一个丑陋的外键约束,如下面的
alter table TEST.DETAILS add constraint FK9FDD7BA22964C454 foreign key (DETAILS_ID) references TEST.DATA
如何在这种情况下创建干净的外键约束?我需要创建一个名为'FK_DATA_ID'的外键约束。
答案 0 :(得分:3)
@ForeignKey
具有您可以在此处使用的属性inverseName
,根据文档
inverseName引用另一方约束,
所以你可以使用@ForeignKey(name = "FK_DATA_ID", inverseName = "FK_DATA_INVRS_ID")
这是link
<强>更新强>
hibernate中似乎有bug,这里是link。从Hibernate版本4.3.1开始解析
他们已弃用org.hibernate.annotations.ForeignKey
您需要使用新的javax.persistence.ForeignKey
答案 1 :(得分:1)
我对具有JOINED继承的表有类似的问题。尝试使用已弃用的@ org.hibernate.annotations.ForeignKey 注释。在很多地方它仍然(hibernate 4.3.8)比javax.persistence包中的更好。
然后现代的javax.persistence.ForeignKey不起作用,我的建议是将它与不推荐使用的org.hibernate.annotations.ForeignKey结合使用,在它旁边留下有用的注释:
// TODO remove when modern approach works as intended