用JPA/Hibernate覆盖join-inheritance外键名

Ste*_*eph 5 mysql hibernate jpa foreign-keys

我有一个类继承自Media类的CD:

光盘:

@Entity
public class CD extends Media {
   ...
}
Run Code Online (Sandbox Code Playgroud)

媒体:

@Entity(name = "media")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Media extends PersistenceId<Long> {
   ...
}
Run Code Online (Sandbox Code Playgroud)

JPA自动生成一个外键名称,我想用我想要的名称覆盖它:

03-10 18:16:58.174 [main] DEBUG org.hibernate.SQL - alter table cd add constraint FK_ehd468g2cptgh6bq6sxe75xlf外键(id)引用媒体(id)

怎么做 ?我试过了:

@Entity
@AssociationOverride(
   name = "id",
   foreignKey = @ForeignKey(name = "fk_cd_media")
)
public class CD extends Media {
   ...
}
Run Code Online (Sandbox Code Playgroud)

@Entity
@PrimaryKeyJoinColumn(foreignKey=@ForeignKey(name = "fk_cd_media"))
public class CD extends Media {
   ...
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

这是生成的create table sql:

CREATE TABLE `cd` (
  `artist` varchar(255) DEFAULT NULL,
  `year` int(11) NOT NULL,
  `id` bigint(20) NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `FK_ehd468g2cptgh6bq6sxe75xlf` FOREIGN KEY (`id`) REFERENCES `media` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Run Code Online (Sandbox Code Playgroud)

我想要:

CONSTRAINT `fk_cd_media` FOREIGN KEY (`id`) REFERENCES `media` (`id`)
Run Code Online (Sandbox Code Playgroud)

Jai*_*ana 6

您的第二次尝试是要走的路:

@Entity
@PrimaryKeyJoinColumn(foreignKey=@ForeignKey(name = "fk_cd_media"))
public class CD extends Media {
   ...
}
Run Code Online (Sandbox Code Playgroud)

问题是您正面临 Hibernate 错误:https : //hibernate.atlassian.net/browse/HHH-10352

编辑:问题已解决:

修复版本:5.0.10、5.2.1、5.1.1