2015-07-13 5 views
4

я следующие таблицы, как я могу сопоставить их JPA сущности:JPA, как сделать составной ключ часть составного первичного ключа

TABLE Event { 
EventID 
SourceID 
....Other event fields 
PK (EventID, SourceID) 
} 

TABLE MEETING { 
MeetingID 
EventID 
SourceID 
...Other meeting fields 
PK(MeetingID,EventID, SourceID) 
FK(EventID, SourceID) //FK with Event table 
} 

Таблица событий имеет один-ко-многим с таблицей Meeting. Как я могу сопоставить эти двунаправленные отношения в JPA?

+0

Мы получили то, что вы хотите сказать, но можете изменить свой вопрос. Таблица не может иметь несколько первичных ключей. http://stackoverflow.com/questions/20742922/can-a-table-have-multiple-primary-keys –

ответ

8
@Embeddable 
public class EventID { 
    public int eventID; 
    public int sourceID; 
} 

@Entity 
public class Event { 
    @EmbeddedId 
    public EventID id; 

    @OneToMany(mappedBy="event") 
    public Collection<Meeting> meetings; 
} 

@Embeddable 
public class MeetingID { 
    public EventID eventID; // corresponds to ID type of Event 
    public int meetingID; 
} 

@Entity 
public class Meeting { 
    @EmbeddedId 
    public MeetingID id; 

    @MapsId("eventID") 
    @JoinColumns({ 
     @JoinColumn(name="EventID", referencedColumnName="EventID"), 
     @JoinColumn(name="SourceID", referencedColumnName="SourceID") 
    }) 
    @ManyToOne 
    public Event event; 
} 

Обсуждено в спецификации JPA 2.1, раздел 2.4.1.

3
@Entity 
public class Event { 

    @EmbeddedId 
    private EventId id; 

    @OneToMany(mappedBy = "event") 
    private List<Meeting> meetings = new ArrayList<>(); 
} 

@Embeddable 
public class EventId implements Serializable { 

    @Column(name = "EventID") 
    private Long eventId; 

    @Column(name = "SourceID") 
    private Long sourceId; 

    //implements equals and hashCode 
} 

@Entity 
public class Meeting { 

    @EmbeddedId 
    private MeetingId id; 

    @MapsId("eventId") 
    @JoinColumns({ 
     @JoinColumn(name="EventID", referencedColumnName="EventID"), 
     @JoinColumn(name="SourceID", referencedColumnName="SourceID") 
    }) 
    @ManyToOne 
    private Event event; 
} 

@Embeddable 
public class MeetingId implements Serializable { 

    @Column(name = "MeetingID") 
    private Long meetingId; 

    private EventId eventId; 

    //implements equals and hashCode 
} 

Для получения более подробной информации, вы можете ознакомиться с аналогичным question.

Смежные вопросы