[英]Mapping JPA Entities
我有很多桌子
programme episode performer prog_ep_perf
---------- --------- --------- ------------
programmeId episodeId performerId programmeId
progTitle episodeTitle performerName episodeId
programmeId performerId
prog_ep_perf
是一个prog_ep_perf
表( prog_ep_perf
表,情节表中的programmeId可能是多余的吗?)。 我已经建立了以下关系,我认为这是正确的
programme
@OneToMany
episode --> One programme can have many episodes
@OneToMany
performers --> One programme can have many performers
episode
@OneToOne
programme --> One episode links to one programme
@OneToMany
performers --> One episode can have many performers
performer
@OneToMany
programme --> One performer can have many programmes
@OneToMany
episode --> One performer can have many episodes
这是我设置实体的方法,对吗?
@Entity
@Table(name = "PROGRAMME")
public class Programme {
@Id
@GeneratedValue(generator="increment")
@GenericGenerator(name="increment", strategy="increment")
private Long programmeId;
private String progTitle;
@OneToMany(
targetEntity=Performer.class,
cascade={CascadeType.PERSIST, CascadeType.MERGE}
)
@JoinTable(
name="PROG_EP_PERF",
joinColumns=@JoinColumn(name="PROGRAMMEID"),
inverseJoinColumns={@JoinColumn(name="PERFORMERID")}
)
private Set<Performer> performers;
@OneToMany(
targetEntity=Performer.class,
cascade={CascadeType.PERSIST, CascadeType.MERGE}
)
@JoinTable(
name="PROG_EP_PERF",
joinColumns=@JoinColumn(name="PROGRAMMEID"),
inverseJoinColumns={@JoinColumn(name="EPISODEID")}
)
private Set<Episode> episodes;
}
@Entity
@Immutable
@Table(name = "EPISODE")
public class Episode {
@Id
@GeneratedValue(generator="increment")
@GenericGenerator(name="increment", strategy="increment")
private Long episodeId;
@Type(type="com.springtests.model.Programme")
@OneToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
@JoinColumn(name="PROGRAMMEID")
private Programme programme;
private String episodeTitle;
@OneToMany(
targetEntity=Performer.class,
cascade={CascadeType.PERSIST, CascadeType.MERGE}
)
@JoinTable(
name="PROG_EP_PERF",
joinColumns=@JoinColumn(name="EPISODEID"),
inverseJoinColumns={@JoinColumn(name="PERFORMERID")}
)
private Set<Performer> performers;
}
@Entity
@Immutable
@Table(name = "PERFORMER")
public class Performer {
@Id
@GeneratedValue(generator="increment")
@GenericGenerator(name="increment", strategy="increment")
private Long performerId;
private String performerName;
@OneToMany(
cascade = {CascadeType.PERSIST, CascadeType.MERGE},
targetEntity = Programme.class
)
@JoinTable(
name="PROG_EP_PERF",
joinColumns=@JoinColumn(name="PERFORMERID"),
inverseJoinColumns={@JoinColumn(name="PROGRAMMEID")}
)
public Set<Programme> programmes;
@OneToMany(
cascade = {CascadeType.PERSIST, CascadeType.MERGE},
targetEntity = Programme.class
)
@JoinTable(
name="PROG_EP_PERF",
joinColumns=@JoinColumn(name="PERFORMERID"),
inverseJoinColumns={@JoinColumn(name="EPISODEID")}
)
public Set<Episode> episodes;
}
如果表是固定的,并且您只需要实体来表示数据库中的内容,那么程序看起来像有一个OneToMany可以插播,而情节具有使用节目集.programmeId字段作为外键返回的ManyToOne:
public class Programme {
..
@OneToMany(mappedby="programme")
private Set<Episode> episodes;
..
public class Episode {
..
@ManyToOne
@JoinColumn(name = "programmeId")
private Programme programme;
..
由于Episode.programme关系控制数据库中的外键,因此要实际添加Programme.episodes集合取决于您。 如果这样做,则必须自己进行维护,以在进行更改时使双方保持同步。 即,如果将情节添加到集合中,那么JPA不会自动修复程序参考,当您将情节指向某个情节时,JPA也不会将情节添加到程序的集合中。
至于prog_ep_perf表,这是3种方式的映射,可能很难处理。 如果要为每一行填充所有3个外键,则无法按照您的布局方式对其进行映射,因为通过将其分成多个1:M映射,一个外键将始终为null。
相反,最好的解决方案是将prog_ep_perf表映射为一个实体,以便您可以完全根据需要在应用程序中进行处理。 另一种选择是使用Map作为具有ManyToMany关系的集合类型。 有关其他信息(JPA 1.0),请参见http://en.wikibooks.org/wiki/Java_Persistence/ManyToMany#Mapping_a_Join_Table_with_Additional_Columns ;对于JPA 2.0,请参见https://wiki.eclipse.org/EclipseLink/Examples/JPA/2.0/MapKeyColumns和http://docs.oracle.com/javaee/6/api/javax/persistence/MapKeyJoinColumn.html ,但看起来可能像这样:
public class Programme {
..
@ManyToMany
@JoinTable(name="prog_ep_perf",
joinColumns=@JoinColumn(name="episodeId"),
inverseJoinColumns=@JoinColumn(name="programmeId"))
@MapKeyJoinColumn(name="performerId")
Map<Performer, Episode> prog_ep_perf;
..
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.