2009-08-12 11 views
3

をテーブルに参加する私は、エンティティを持っている。このように見えること:JPAは、複数のエンティティで

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を伝える方法はありますか? その一部または他のエンティティと同様に、自動的に関連エンティティを取得します。

ありがとうございます。

答えて

3

あなたのPKオブジェクトでは、idをlongとして保存する必要はありません(実際には、エンティティへの参照が必要なたびにtrueです)。実際の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にこれをマッピングします

...:「ロングをnpc_id "ここで" Npc npc "を参照します。 「良いgood_id」は「Good good」を意味します。

重要なこと:@ManyToOneで@Columnを使用することはできません。代わりに@JoinColumnを使用して、今と同じことをすることができます。

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

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

関連する問題