[英]JPA, Hibernate, Java. Composite primary key, one of them is also foreign key
标题中简短描述了我的问题。 谁能告诉我,如何使用JPA获得相同的数据库?
create table ALBUM
(
IdAlbum int,
AlbumName varchar(35) not null,
UrlOfAlbum varchar(60) not null,
Primary Key(IdAlbum)
);
create table ARTIST
(
IdArtist int,
ArtistName varchar(35) not null,
Primary Key(IdArtist)
);
create table TRACK
(
IdTrack int,
IdAlbum int,
IdArtist int,
TrackName varchar(35) not null,
Primary Key(IdTrack, IdAlbum),
Foreign Key(IdAlbum) references Album(IdAlbum),
Foreign Key(IdArtist) references Artist(IdArtist)
);
只需将各列放入嵌入式键中并在主类中保持关系即可:
@Embeddable
class TrackId
{
private Integer idAlbum;
private Integer idTrack;
// getters, setters, equals and hashCode
}
@Entity
class Track
{
@EmbeddedId
TrackId trackId;
@ManyToOne
@MapsId("idAlbum")
@JoinColumn(name = "idAlbum", referencedColumnName = "idAlbum")
private Album album = null;
....
}
您必须使用@javax.persistence.Embeddable
定义一个Composite-id类
@Embeddable
public class TrackPK {
@Column(name = "IdTrack")
private Integer trackId;
@JoinColumn(name = albumId, referencedColumnName = "IdAlbum")
private Album album;
// setters & getters
// you also have to implement equals and hashCode
}
从那时起,有两种方法。 您可以在Track
类内部使用带有@EmbeddedId
注释的TrackPK
对象(如Vyskovsky建议),也可以在Track
外部使用@IdClass(TrackPK.class)
和@Entity
注释。 你也将不得不从复制领域和setter TrackPK
在课堂上Track
,并使用相同的落实equals
和hashCode
的Track
类,并添加@Id
在这两个领域的注释。
我知道这听起来很像,但它只是复制粘贴整个TrackPK的内部内容,它会将track.getTrackPK().getAlbum()
转换为track.getAlbum()
,即使直接使用该TrackPK类也可以使您免于负担。 您可以让JPA处理它。
您需要使用“派生身份”:
@Entity
public class Album {
@Id
@Column(name = "IdAlbum")
private Integer id;
@Column(name = "AlbumName")
private String name;
...
}
@Embeddable
public class TrackID {
@Column(name = "IdTrack")
private Integer trackID;
@Column(name = "IdAlbum")
private Integer albumID; // NB: corresponds to PK type of Album
...
}
@Entity
public class Track {
@EmbeddedId
TrackID id;
@ManyToOne
@MapsId("albumID") // NB: maps 'albumID' attribute of embedded id
@JoinColumn(name = "IdAlbum", referencedColumnName = "IdAlbum")
private Album album;
...
}
JPA 2.1规范的第2.4.1节中讨论了派生身份。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.