JPA, wie man den zusammengesetzten Fremdschlüssel zum Bestandteil des zusammengesetzten Primärschlüssels macht

Lesezeit: 2 Minuten

Benutzer-Avatar
suraj bahl

Ich habe folgende Tabellen, wie ich sie JPA-Entitäten zuordnen kann:

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
}

Die Ereignistabelle hat eine Eins-zu-Viele-Beziehung mit der Besprechungstabelle. Wie kann ich diese bidirektionale Beziehung in JPA abbilden?

  • Wir haben verstanden, was Sie sagen möchten, aber Sie können Ihre Frage bearbeiten. Eine Tabelle kann nicht mehrere Primärschlüssel haben. stackoverflow.com/questions/20742922/…

    – Raman Sahasi

    13. Juli 2015 um 17:28 Uhr

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

Besprochen in JPA 2.1 Spezifikation, Abschnitt 2.4.1.

  • Muss ich in diesem Fall die Meeting-ID manuell festlegen? Oder kann ich zufällig generieren?

    – Cristiano Bombazar

    20. September 2019 um 1:14 Uhr

  • @CristianoBombazar – Sie können die Meeting-ID so oder so festlegen; Es ist jedoch wahrscheinlich üblicher, den Wert manuell festzulegen, da er normalerweise eine gewisse semantische Bedeutung hat und/oder durch das zugehörige Ereignis begrenzt ist. Also der zusammengesetzte Primärschlüssel.

    – Brian Vosburgh

    20. September 2019 um 13:16 Uhr

  • Ich habe eine ähnliche Situation, in der mein pk und FK ein Feld teilen, aber nicht alle FK-Felder in pk sind. Ich habe es geschafft, dass es mit Ihrem Beispiel funktioniert, aber ich musste MeetingID immer manuell setzen. Ist dieses Verhalten korrekt?

    – Cristiano Bombazar

    20. September 2019 um 14:27 Uhr

  • @CristianoBombazar – ja, Sie müssen die Meeting-ID manuell festlegen.

    – Brian Vosburgh

    21. September 2019 um 23:35 Uhr

  • Habe ich sowohl die Besprechungs-ID als auch das Ereignis festgelegt? Da das Ereignis durch eventId in meetingId abgebildet wird, würde es nicht ausreichen, meetingId festzulegen?

    – Andreas

    25. Dezember 2020 um 12:55 Uhr

Benutzer-Avatar
Dragan Bozanović

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

Vielleicht möchten Sie sich eine ähnliche Frage ansehen, um weitere Details zu erhalten.

1014800cookie-checkJPA, wie man den zusammengesetzten Fremdschlüssel zum Bestandteil des zusammengesetzten Primärschlüssels macht

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy