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;
}

タイプ列(列挙)に基づいて、どのOneToMany関係であるかをJPAに伝える方法はありますか? 部品または他のエンティティの場合と同様に、関連するエンティティを自動的に取得します。

前もって感謝します。

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は、次を使用してこれをDBにマップします。「longnpc_id」ここで「Npcnpc」を参照します。「longgood_id」は「Goodgood」を指します。

重要なことの1つは、@Columnを@ManyToOneと一緒に使用することはできないということです。代わりに@JoinColumnを使用すると、現在と同じことができます。

また、これらすべての「オプション」を指定する必要はありません。'nullable'はそれを処理する必要があります。

編集:ああ、NpcTradeGoodPKのNpcはおそらくそれを埋め込んだエンティティのNpcと衝突するでしょう。それらの1つの名前を変更することを検討してください。

于 2009-08-14T11:45:45.510 に答える