JPA连接表有多个实体

时间:2009-08-12 23:53:51

标签: java jpa toplink

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

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关系基于类型列(枚举)? 就像它是一个部分或任何其他实体一样,它会自动获得相关实体。

提前致谢。

1 个答案:

答案 0 :(得分:3)

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

所以,如果你使用它(请注意我用实际的实体引用替换了你的'long'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会将此映射到DB,使用:“long npc_id”,其中我们引用“Npc npc”;和“long good_id”,我们称之为“好的”。

重要的一点是:你不能将@Column与@ManyToOne一起使用。您可以使用@JoinColumn来执行与现在相同的操作。

此外,您无需指定所有这些“选项”。 'nullable'应该照顾好。

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