2009-08-12 2 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; 
} 

Есть ли способ сказать JPA, который OneToMany отношения он основан на колонке типа (перечисления)? Как и в случае его части или любого другого объекта, она автоматически получает связанный объект.

Заранее спасибо.

ответ

3

В вашем объекте PK вам не нужно хранить идентификаторы как длинные (на самом деле это верно каждый раз, когда вам нужна ссылка на объект). При сопоставлении с фактической схемой БД JPA заменяет все ссылки на другие объекты идентификаторами объектов.

Таким образом, если вы используете это (заметьте, что я заменил свои «длинные» идентификаторы с реальными ссылками на лицо):

@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 будет отображать это в БД, используя: «длинными npc_id ", где мы говорим о" Npc npc "; и «long good_id», где мы говорим о «Хорошем добром».

Одна важная вещь: вы не можете использовать @Column с @ManyToOne. Вместо этого вы можете использовать @JoinColumn, что позволит вам делать то же самое, что и сейчас.

Кроме того, вам не нужно указывать все эти опции. «nullable» должен позаботиться об этом.

Отредактировано: ah, Npc в NpcTradeGoodPK, вероятно, столкнется с Npc в сущности, которая его внедряет. Подумайте о переименовании одного из них.