繁体   English   中英

JPA,Hibernate,Java。 复合主键,其中之一也是外键

[英]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 ,并使用相同的落实equalshashCodeTrack类,并添加@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM