3

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

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 关系?就像它的一部分或任何其他实体一样,它会自动获取相关实体。

提前致谢。

4

1 回答 1

3

在您的 PK 对象中,您不需要将 id 存储为 long(实际上,每次您需要对实体的引用时都是如此)。当映射到实际的 DB 模式时,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 发生碰撞。考虑重命名其中之一。

于 2009-08-14T11:45:45.510 回答