2016-10-15 11 views
0

タイトルの直後に問題があります。誰でも私にJPAを使って同じデータベースを手に入れることはできますか?JPA、Hibernate、Java。複合プライマリキー、そのうちの1つも外部キーです

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) 
); 

答えて

0

だけ埋め込まれたキーに列を入れて、メインクラスに関係を保つ:

@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; 

     .... 
} 
0

あなたはそれ以降は@javax.persistence.Embeddable

@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 
} 

を用いた複合-IDのクラスを定義する必要があります2つの方法があります。 Trackクラス内のTrackPKオブジェクトを@EmbeddedIdアノテーション(Vyskovskyが示唆している)と一緒に使用するか、またはTrackの外に@IdClass(TrackPK.class)@Entityアノテーションとともに使用できます。また、TrackPKクラスのフィールドとセッターをTrackに複製し、Trackクラスの場合はequalsとと同じ実装を使用し、両方のフィールドに@Idアノテーションを追加する必要があります。

私はそれがたくさん聞こえますが、TrackPK内臓全体をコピー&ペーストするだけで、​​はtrack.getAlbum()になり、そのTrackPKクラスを直接使用することはできません。 JPAに処理させるだけです。

0

あなたは "派生アイデンティティ" を使用する必要があります。

@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で説明されています。

関連する問題