2016-10-15 7 views
0

У меня проблема, описанная коротко в заголовке. Может ли кто-нибудь сказать мне, как я могу получить одну и ту же базу данных с помощью JPA?JPA, Hibernate, Java. Компонентный первичный ключ, один из которых также является внешним ключом

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

Вы должны определить класс композиционно-ID с помощью @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 
} 

С тех пор есть два пути. Вы можете использовать объект TrackPK внутри вашего класса Track с аннотацией @EmbeddedId (как предложил Выковский), или вы можете использовать @IdClass(TrackPK.class) вне вашего Track вместе с аннотацией @Entity. Вам также придется дублировать поля и сеттеры из класса TrackPK в Track и использовать ту же реализацию equals и hashCode для класса Track и добавить аннотацию @Id в оба поля.

Я знаю Это звучит очень много, но это просто копирование всех дорожек TrackPK, и оно превращает track.getTrackPK().getAlbum() в 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.

Смежные вопросы