当前位置: 首页 > 知识库问答 >
问题:

用JPA/Hibernate覆盖联合继承外键名

公良信然
2023-03-14

我有一张从班级媒体继承的班级CD:

光盘:

@Entity
public class CD extends Media {
   ...
}

媒体:

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

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

03-10 18:16:58.174[main]调试org.hibernate。SQL-alter table cd添加约束FK_ehd468g2cptgh6bq6sxe75xlf外键(id)引用媒体(id)

怎么做?我试过:

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

@Entity
@PrimaryKeyJoinColumn(foreignKey=@ForeignKey(name = "fk_cd_media"))
public class CD extends Media {
   ...
}

但它不起作用。

下面是 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;

我想:

CONSTRAINT `fk_cd_media` FOREIGN KEY (`id`) REFERENCES `media` (`id`)

共有1个答案

乜飞航
2023-03-14

你的第二次尝试是正确的:

@Entity
@PrimaryKeyJoinColumn(foreignKey=@ForeignKey(name = "fk_cd_media"))
public class CD extends Media {
   ...
}

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

编辑:问题解决了:

修复版本:5.0.10、5.2.1、5.1.1

 类似资料:
  • 问题内容: 我在我的班级结构上定义了一个复合ID,如下所示。不幸的是,我总是收到一个hibernate错误,抱怨找不到的“ part2”: “在实体MoreClass中找不到@IdClass的属性:第2部分” 有人可以帮我解决问题吗?(或者至少在一个有用的jpa / hibernate文档上指向我?) 问题答案: 居然撞到了。 如: 确实可行,我认为这是一个错误。参见https://hiberna

  • 问题内容: 我在为某些实体设置jpa映射时遇到麻烦。我有一个如下定义的父实体。 然后,我有一个带有复合键的子实体,以及此表的主键的外键,如下所示: 我知道子实体不正确,但是我不确定如何将其设置为具有复合PK。我知道我需要设置一个PK类,但是当一个字段是父类的外键时,我不确定该怎么做。一旦设置好,父级将如何引用子级实体? 任何帮助表示赞赏。 问题答案: 这受JPA 2规范的 第2.4.1节“与派生身

  • 我有一个项目,其中一部分数据结构是用@ Inheritance(strategy = Inheritance type)制作的。已加入)。数据结构的这一部分看起来像这样: 该设计基于本文的思想。我使用Hibernate和JPA2接口作为我的数据层。上面的结构产生了下面的pojo/dao类(省略了getter和setter): 基本项: 物理项目: 一些硬件: 其他硬件: 这是我的问题: 我的另一个

  • 我对JPA中的继承是新手。我不知道如何查询这样的内容: 让我们假设一个联接继承映射,其中a是一个具有'id'和'name'的实体。还有从A继承的实体A1和A2。A1提供字段'int1',A2提供字段'int2'

  • 问题内容: 我们对PostgreSQL中的继承以及在JPA中将其映射为实体存在疑问。我们的数据库和我们要映射的表是: 我们在Netbeans 7.1.2中使用自动工具将它们映射到实体。起初我认为仅添加就足够了 因此,它只是 扩大了 ,但无法正常工作。最好的方法是什么?提前致谢。 问题答案: JPA的继承概念基于普通表。它并没有真正“理解” PostgreSQL表继承的想法。这是使用旨在暴露功能的最

  • 问题内容: 为什么超类的实例变量在继承中不被覆盖? 问题答案: 因为继承旨在修改行为。行为是通过方法公开的,这就是为什么可以覆盖它们的原因。 字段不是行为而是状态。您不需要修改它,也不需要修改超类使用的私有方法。它们旨在让超类完成其工作。