JPA如何制作复合主键的复合外键部分

sur*_*ahl 22 java hibernate 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
}
Run Code Online (Sandbox Code Playgroud)

Event表与Meeting表具有一对多的关系.我如何在JPA中映射这种双向关系?

Bri*_*rgh 22

@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;
}
Run Code Online (Sandbox Code Playgroud)

在JPA 2.1规范,第2.4.1节中讨论.

  • @CristianoBombazar - 您可以通过任何一种方式设置meetingID;但手动设置该值可能更常见,因为它通常具有一些语义含义和/或由关联事件限定范围。因此复合主键。 (2认同)
  • 我是否同时设置了会议 ID 和事件?既然事件是由meetingId中的eventId映射的,那么设置meetingId还不够吗? (2认同)

Dra*_*vic 6

@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
}
Run Code Online (Sandbox Code Playgroud)

您可能需要看一个类似的问题以获取更多详细信息。