我正在使用 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。
通过一些实验,我发现以下解决方案似乎完全符合我的需要:
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "id.deckID")
private Set<DeckEntry> entries;
注意
mappedBy
- 我不知道可以使用点语法“步入”嵌入式 ID。我检查了此映射生成的 SQL 查询,它们似乎是有效的。