JPA如何将复合外键作为复合主键的一部分

7 浏览
0 Comments

JPA如何将复合外键作为复合主键的一部分

我有以下表格,如何将它们映射到JPA实体:

表格"Event"包含以下字段:

- EventID

- SourceID

- 其他事件字段

主键为(EventID, SourceID)

表格"Meeting"包含以下字段:

- MeetingID

- EventID

- SourceID

- 其他会议字段

主键为(MeetingID, EventID, SourceID)

外键(EventID, SourceID)与Event表相关联

Event表与Meeting表之间存在一对多的关系。如何在JPA中映射这种双向关系?

0
0 Comments

在JPA中,有时我们需要将外键作为复合主键的一部分。下面的代码示例展示了一个这样的情况:

public class EventID {
    public int eventID;
    public int sourceID;
}
public class Event {
    public EventID id;
    (mappedBy="event")
    public Collection meetings;
}
public class MeetingID {
    public EventID eventID; // corresponds to ID type of Event
    public int meetingID;
}
public class Meeting {
    public MeetingID id;
    ("eventID")
    ({
        (name="EventID", referencedColumnName="EventID"),
        (name="SourceID", referencedColumnName="SourceID")
    })
    public Event event;
}

这里的问题是如何将复合外键作为复合主键的一部分。根据JPA 2.1规范的2.4.1小节,我们需要手动设置meetingID。这是因为meetingID通常具有语义意义,并且是与关联的Event有关的。因此,设置复合主键的值通常是手动设置的。

某些情况下在类似的情况下,主键和外键共享一个字段,但不是所有的外键字段都在主键中。他在使用上面的示例时,发现必须手动设置meetingID。这种行为是正确的,需要手动设置meetingID。

有人问是否需要同时设置meetingID和event?由于event在meetingID中由eventId进行了映射,是否只设置meetingID就足够了?在2.4.1小节中,还有许多关于如何处理父子之间的每个IdClass和EmbeddedId组合的示例。需要注意的是,当使用IdClasses时,字段名称需要在IdClass和子实体本身中相同。

总结起来,以上是关于JPA如何将复合外键作为复合主键的一部分的问题以及解决方法。根据规范要求,我们需要手动设置复合主键的值,并且在设置时要注意字段名称的一致性。

0
0 Comments

JPA如何使复合外键成为复合主键的一部分?

在上述代码中,问题出现在Meeting实体类中的id属性上。该属性是一个复合主键,由meetingId和eventId组成。而eventId是一个复合外键,由eventId和sourceId组成。

解决这个问题的方法是在MeetingId类中将eventId的类型改为EventId,并在Meeting类中将eventId属性改为EventId类型。这样,Meeting实体类中的id属性就能正确地表示复合主键了。

下面是修改后的代码:

public class Event {
    private EventId id;
    @OneToMany(mappedBy = "event")
    private List meetings = new ArrayList<>();
}
public class EventId implements Serializable {
    @Column(name = "EventID")
    private Long eventId;
    @Column(name = "SourceID")
    private Long sourceId;
    //implements equals and hashCode
}
public class Meeting {
    private MeetingId id; 
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="EventID", referencedColumnName="EventID"),
        @JoinColumn(name="SourceID", referencedColumnName="SourceID")
    })
    private Event event;
}
public class MeetingId implements Serializable {
    @Column(name = "MeetingID")
    private Long meetingId;
    private EventId eventId;
    //implements equals and hashCode
}

通过以上修改,Meeting实体类中的id属性就能正确地表示复合主键了。

0