JPA如何将复合外键作为复合主键的一部分
在JPA中,有时我们需要将外键作为复合主键的一部分。下面的代码示例展示了一个这样的情况:
public class EventID { public int eventID; public int sourceID; } public class Event { public EventID id; (mappedBy="event") public Collectionmeetings; } 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如何将复合外键作为复合主键的一部分的问题以及解决方法。根据规范要求,我们需要手动设置复合主键的值,并且在设置时要注意字段名称的一致性。
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 Listmeetings = 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属性就能正确地表示复合主键了。