【问题标题】:Override the Foreign Key Name pointing to Composite Key JPA/Hibernate覆盖指向复合键 JPA/Hibernate 的外键名称
【发布时间】:2017-12-19 21:13:18
【问题描述】:

我正在使用带有 spring-data-jpa 的 spring-boot 1.5.4,并且我试图在 spring.jpa.hibernate.ddl-auto=create 期间覆盖自动生成的外键名称。

对于简单的 id,我可以覆盖它:simple_fk

Hibernate: alter table my_entity add constraint simple_fk foreign key (simple_id) references simple

但不适用于具有复合 id 的外键:FKms12cl9ma3dk8egqok1dasnfq

Hibernate: alter table my_entity add constraint FKms12cl9ma3dk8egqok1dasnfq foreign key (composite_id1, composite_id2) references composite

我的代码有什么问题?我也试过@PrimaryKeyJoinColumn

请参阅下面的类定义。

@Entity
public class Simple {
    @Id
    private long id;
}

@Entity
public class Composite {
    @Id
    private CompositeId id;
}

@Embeddable
public class CompositeId {
    @Column
    private long id1;
    @Column
    private long id2;
}

@Entity
public class MyEntity {
    @ManyToOne
    @JoinColumn(foreignKey = @ForeignKey(name = "simple_fk"),
        name = "simple_id", referencedColumnName = "id")
    private Simple simple;

    @ManyToOne
    @JoinColumns(foreignKey = @ForeignKey(name = "composite_fk"), value = { 
        @JoinColumn(name = "composite_id1", referencedColumnName = "id1"),
        @JoinColumn(name = "composite_id2", referencedColumnName = "id2") 
    })
    private Composite composite;
}

【问题讨论】:

    标签: java hibernate jpa spring-boot


    【解决方案1】:

    这是带有 Hibernate 的 known issue,已在 5.2.8 版中修复

    所以有两种方法可以修复它:要么将 Hibernate 更新到 5.2.8 版本,要么通过添加

    <hibernate.version>5.2.10.Final</hibernate.version>
    

    到你的 pom.xml,它基本上会将 Hibernate 更新到最新版本。

    或者如果 Hibernate 更新不可能或风险太大,您可以在您的 composite 字段会让你的代码看起来像

    @Entity
    public class MyEntity {
        @ManyToOne
        @JoinColumn(foreignKey = @ForeignKey(name = "simple_fk"), name = "simple_id", referencedColumnName = "id")
        private Simple simple;
    
        @ManyToOne
        @JoinColumns(foreignKey = @ForeignKey(name = "composite_fk"), value = {
            @JoinColumn(name = "composite_id1", referencedColumnName = "id1"),
            @JoinColumn(name = "composite_id2", referencedColumnName = "id2") })
        @org.hibernate.annotations.ForeignKey(name = "composite_fk")
        private Composite composite;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-12-31
      • 2016-06-05
      • 2018-02-02
      • 2012-01-06
      • 2011-03-20
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      相关资源
      最近更新 更多