我有一个看起来像这样的实体:
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关系基于类型列(枚举)? 就像它是一个部分或任何其他实体一样,它会自动获得相关实体。
提前致谢。
答案 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发生冲突。考虑重命名其中一个。