gpt4 book ai didi

java - 具有多个实体的 JPA 连接表

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:04:45 25 4
gpt4 key购买 nike

我有一个看起来像这样的实体:

public class NpcTradeGood implements Serializable, Negotiabble {
private static final long serialVersionUID = 1L;
@EmbeddedId
protected NpcTradeGoodPK npcTradeGoodPK;
@JoinColumn(name = "npc_id", referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
@ManyToOne(optional = false)
private Npc npc;
}

@Embeddable
public class NpcTradeGoodPK implements Serializable {
@Basic(optional = false)
@Column(name = "npc_id", nullable = false)
private long npcId;
@Basic(optional = false)
@Column(name = "good_id", nullable = false)
private long goodId;
@Basic(optional = false)
@Column(name = "type", nullable = false)
@Enumerated(EnumType.STRING)
private ItemType type;
}

有没有办法根据类型列(枚举)告诉JPA它是哪种OneToMany关系?就像它的一部分或任何其他实体一样,它会自动获取相关实体。

提前致谢。

最佳答案

在您的 PK 对象中,您不需要将 ID 存储为 long(实际上,每次您需要对实体的引用时都是如此)。当映射到实际的数据库模式时,JPA 将所有对其他实体的引用替换为这些实体的 ID。

因此,如果您使用它(请注意,我用对实体的实际引用替换了您的“长”ID):

@Embeddable
public class NpcTradeGoodPK implements Serializable {
@ManyToOne
@JoinColumn(name = "npc_id", nullable = false)
private Npc npc;
@ManyToOne
@JoinColumn(name = "good_id", nullable = false)
private Good good;
@Column(name = "type", nullable = false)
@Enumerated(EnumType.STRING)
private ItemType type;
}

... JPA 会将此映射到数据库,使用: “long npc_id” 我们指的是“Npc npc”;和“long good_id”,我们指的是“Good good”。

一件重要的事情:您不能将@Column 与@ManyToOne 一起使用。您可以改用 @JoinColumn,这将允许您执行与现在相同的操作。

此外,您不需要指定所有这些“可选值”。 'nullable' 应该解决这个问题。

编辑:啊,NpcTradeGoodPK 中的 Npc 可能会与嵌入它的实体中的 Npc 发生碰撞。考虑重命名其中之一。

关于java - 具有多个实体的 JPA 连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1269341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com