在@OnetoOne共享主键场景中更改生成的Hibernate外键

时间:2014-02-25 06:21:45

标签: mysql sql hibernate jpa-2.0 hibernate-annotations

我在使用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'的外键约束。

2 个答案:

答案 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