如何在 Hibernate 中创建针对组合主键的 OneToMany 关系?

问题描述 投票:0回答:1

我正在使用 Spring Data 和 Hibernate 开发一款牌组构建纸牌游戏。我想映射以下 PostGreSQL 表:

CREATE TABLE Deck(
    ID UUID NOT NULL,
    name VARCHAR(255) NOT NULL,
    PRIMARY KEY(ID)
);

CREATE TABLE DeckEntry(
    deckID UUID NOT NULL,
    cardID UUID NOT NULL,
    cardCount INT NOT NULL,

    PRIMARY KEY(deckID, cardID),
    CONSTRAINT fk_deckEntry_deck FOREIGN KEY(deckID) REFERENCES Deck(ID) ON DELETE CASCADE
)

这里的想法是:

  • 一张牌可以在一副牌中出现
    cardCount
    次。
  • 一张卡可以出现在多个牌组中。
  • DeckEntry
    代表关系并包含计数,但没有自己的主键。

这是我在映射方面得到的:

@Entity
public class DeckEntry {
    
    @EmbeddedId
    private DeckEntryID id;

    @Column
    private int cardCount;

    // hashCode and equals based on id
}

@Embeddable
public class DeckEntryID {
   
    @Column
    private UUID deckID;

    @Column
    private UUID cardID;

    // hashcode & equals based on deckId and cardID
}
@Entity
public class Deck {

   @Id
   private UUID id;

   @Column(name = "name")
   private String name;

   @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
   private Set<DeckEntry> entries;

   // hashCode and equals based on id
}

我的问题是:在

Deck.entries
上映射注释方面我还需要什么才能使这项工作按预期进行?这里的主要问题是目标 (
DeckEntry
) 具有组合主键,而构成该主键的部分之一是
Deck
ID 本身。这是构建 SQL 语句的关键信息,但我不知道如何将此信息传递给 hibernate。

hibernate spring-data-jpa hibernate-mapping
1个回答
0
投票

通过一些实验,我发现以下解决方案似乎完全符合我的需要:

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "id.deckID")
private Set<DeckEntry> entries;

注意

mappedBy
- 我不知道可以使用点语法“步入”嵌入式 ID。我检查了此映射生成的 SQL 查询,它们似乎是有效的。

© www.soinside.com 2019 - 2024. All rights reserved.