如何在@OneToOne关系中设置@JoinColumn和@MapsId的外键名称

时间:2018-02-22 12:31:36

标签: java hibernate foreign-keys hibernate-5.x

在以下示例中(来自Vlad Mihalcea's post on "The best way to map a @OneToOne relationship with JPA and Hibernate"):

@Entity(name = "PostDetails")
@Table(name = "post_details")
public class PostDetails {

    @Id
    private Long id;

    @Column(name = "created_on")
    private Date createdOn;

    @Column(name = "created_by")
    private String createdBy;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(foreignKey = @ForeignKey(name = "fk_post"))
    @MapsId
    private Post post;

    public PostDetails() {}

    public PostDetails(String createdBy) {
        createdOn = new Date();
        this.createdBy = createdBy;
    }

    //Getters and setters omitted for brevity
}

我在PostDetailsPost个实体之间存在单向关系,并使用Post重新使用PostDetails的ID作为@MapsId的ID。

除此之外我还添加了

@JoinColumn(foreignKey = @ForeignKey(name = "fk_post"))

因为我想给外键提供自定义名称。不幸的是,Hibernate忽略了我的自定义名称,并为外键分配了自己随机生成的名称。

所以问题是如何在这种情况下设置外键名称(使用@MapsId时)?我试图逃脱而不必使用已弃用的Hibernate @ForeignKey注释。

我测试过的Hibernate版本是5.2.125.2.13

我希望我遗漏了一些东西,但这对我来说似乎是一个Hibernate错误,考虑到HKK在早期版本中有多少与FK名称有关的问题。

更新

我创建了issue in the Hibernate issue tracker

1 个答案:

答案 0 :(得分:0)

使用@JoinColumn的名称属性。 @JoinColumn(name =“”)