【发布时间】:2020-05-15 06:06:57
【问题描述】:
我有 2 个表。表 A 包含复合主键。我将此键用作另一个表中的外键。但是在这个表中,我需要一个复合主键,其中一列我需要从 A 表的复合键中获取它。我无法使用 mapsId 实现这一点,因为它占用了整个 CK。有没有办法实现它?
我只需要像下面这样的休眠方式:
【问题讨论】:
标签: java oracle hibernate jpa orm
我有 2 个表。表 A 包含复合主键。我将此键用作另一个表中的外键。但是在这个表中,我需要一个复合主键,其中一列我需要从 A 表的复合键中获取它。我无法使用 mapsId 实现这一点,因为它占用了整个 CK。有没有办法实现它?
我只需要像下面这样的休眠方式:
【问题讨论】:
标签: java oracle hibernate jpa orm
以下是您如何映射与您链接到的 SO 问题中的数据库表对应的实体:
@Entity
public class Concert {
@Id
Integer id;
String name;
...
}
@Embeddable
public class ConcertDetailsId {
Date date;
Integer concertId; // corresponds to PK type of Concert
}
@Entity
public class ConcertDetails {
@EmbeddedId
ConcertDetailsId id;
@MapsId("concertId") // maps concertId attribute of embedded id
@ManyToOne
Concert concert;
BigDecimal cost;
...
}
这是您尝试使用@MapsId 的方式吗?如果有,问题出在哪里?
在第 2.4.1 节的JPA 2.2 spec 中讨论了派生的身份(带有示例)。
【讨论】:
ConcertDetails 外键仅使用Concert 中的一个字段,则该字段在Concert 表中必须是唯一的。那是对的吗?如果是这样,您只需将该单个字段用作 Concert 主键(用于 Hibernate)。
Concert 字段本身是 unique (它必须是您的 ConcertDetails 外键才能工作) ,您也许可以只在该单个字段上放置 @Id 注释并将主键的另一半保留为 @Basic 映射。