【问题标题】:How to use part of foreign key which is composite primary key of another table as a primary key in hibernate?如何在hibernate中使用作为另一个表的复合主键的部分外键作为主键?
【发布时间】:2020-05-15 06:06:57
【问题描述】:

我有 2 个表。表 A 包含复合主键。我将此键用作另一个表中的外键。但是在这个表中,我需要一个复合主键,其中一列我需要从 A 表的复合键中获取它。我无法使用 mapsId 实现这一点,因为它占用了整个 CK。有没有办法实现它?

我只需要像下面这样的休眠方式:

I need exactly like this in hibernate

【问题讨论】:

    标签: java oracle hibernate jpa orm


    【解决方案1】:

    以下是您如何映射与您链接到的 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 中讨论了派生的身份(带有示例)。

    【讨论】:

    • 在我的情况下,音乐会有一个复合键,我需要其中的一列而不是整个 ck。我将使用此列和另一个表中的其他列作为 ck
    • 所以,这 “完全”像您在问题中链接到的表格。 : ) 如果ConcertDetails 外键仅使用Concert 中的一个字段,则该字段在Concert 表中必须是唯一的。那是对的吗?如果是这样,您只需将该单个字段用作 Concert 主键(用于 Hibernate)。
    • 我的错,我链接错了.. 抱歉。假设 Concert 有包含 2 个字段的复合键。我只想将其中的 1 个字段用作另一个表的主键。这怎么可能?
    • 正如我在之前的评论中提到的,如果 Concert 字段本身是 unique (它必须是您的 ConcertDetails 外键才能工作) ,您也许可以只在该单个字段上放置 @Id 注释并将主键的另一半保留为 @Basic 映射。
    猜你喜欢
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    相关资源
    最近更新 更多