2009-04-16 45 views
5

我區表:如何在JPA中映射實體的組合鍵?

REG { 
    id number, 
    dateCreation Date 
    } 

我有一個locale表:

LOCALE { 
    locale String 
    } 

我有一個REGION_DESCRIPTION表:

REGION_DESCRIPTION { 
    locale String, 
    regId number, 
    description 
    } 

REGION_DESCRIPTION具有複合鍵:語言環境是一個外鍵指向LOCALE表。 REGId指向REGION表。

我想這個映射到我區的java類:

private List<RegionDescription> descriptions; 

我試着在JPA不同approache。但我無法使映射工作。有什麼建議麼?

回答

2

您有一個連接表(REGION_DESCRIPTION)通過攜帶自己的屬性成爲實體的情況。我建議如下:

  1. 定義RegionDescription與複合 主鍵類 完整的實體,見example; RegionDescription地區RegionDescription區域設置

  2. RegionDescription定義了2個多到一的關係。在

  3. 替代地或另外限定 一個一對多關係地區 映射RegionDescription的 上面指定的方式。

+0

例如鏈接無法正常工作。也許你想更新鏈接 – Jyotirup 2012-02-16 15:48:57

1

這應該滿足您的需要:

@Entity 
public class Region 
{ 
    @Id 
    private Long id; 
    @Temporal(TemporalType.DATE) 
    private Date dateCreation; 
    @OneToMany(mappedBy = "region") 
    @JoinColumn(name = "id", referencedColumnName = "region_id") 
    private List<RegionDescription> descriptions; 
} 

@Entity 
public class Locale 
{ 
    @Id 
    private String name; 
} 

@Entity 
public class RegionDescription 
{ 
    @EmbeddedId 
    private RegionDescriptionPK key; 

    @MapsId(value = "regionId") 
    @ManyToOne 
    @JoinColumns({ 
     @JoinColumn(name = "region_id", referencedColumnName = "id") 
    }) 
    private Region region; 

    @MapsId(value = "localeName") 
    @ManyToOne 
    @JoinColumns({ 
     @JoinColumn(name = "locale", referencedColumnName = "name") 
    }) 
    private Locale locale; 
} 

@Embeddable 
public class RegionDescriptionPK 
{ 
    @Column(name = "id") 
    private Long regionId; 

    @Column(name = "locale") 
    private String localeName; 
} 

作爲一個方面說明,我已經看到了,這個問題是很老。但它不是以某種方式關閉的。 :-)

0

這應該工作:

@Entity 
public class Region 
{ 
    @Id 
    private Long id; 
    @Temporal(TemporalType.DATE) 
    private Date dateCreation; 

    @OneToMany(mappedBy = "regionDescriptionPK.region") 
    private List<RegionDescription> descriptions; 
} 


@Entity 
public class RegionDescription 
{ 
    @EmbeddedId 
    private RegionDescriptionPK regionDescriptionPK;  
} 

@Embeddable 
public class RegionDescriptionPK 
{ 
    @ManyToOne 
    @JoinColumn(name = "Region_ID") 
    private Region region; 

    @ManyToOne 
    @JoinColumn(name = "locale") 
    private Locale locale; 
} 

@Entity 
public class Locale 
{ 
    @Id 
    private String name; 
}