2009-04-16 34 views
5

Tôi có bảng KHU VỰC:Làm cách nào để ánh xạ khóa kết hợp của thực thể trong JPA?

REG { 
    id number, 
    dateCreation Date 
    } 

Tôi có một bảng LOCALE:

LOCALE { 
    locale String 
    } 

Tôi có một bảng REGION_DESCRIPTION:

REGION_DESCRIPTION { 
    locale String, 
    regId number, 
    description 
    } 

REGION_DESCRIPTION có một chìa khóa hợp: locale là một khóa ngoài trỏ đến bảng LOCALE. Và regId trỏ đến bảng REGION.

Tôi muốn bản đồ này đến lớp java Region của tôi:

private List<RegionDescription> descriptions; 

tôi đã cố gắng khác nhau approache trong JPA. Nhưng tôi không thể có được bản đồ để làm việc. Bất kỳ đề xuất?

Trả lời

2

Bạn có trường hợp bảng tham gia (REGION_DESCRIPTION) trở thành thực thể bằng cách mang thuộc tính của riêng nó. Tôi xin đề nghị như sau:

  1. xác định RegionDescription như một thực thể hoàn chỉnh với hỗn lớp khóa chính, xem example;

  2. xác định 2 many-to-một trong những mối quan hệ trong RegionDescription: RegionDescription-RegionRegionDescription-Locale.

  3. cách khác hoặc bổ sung xác định một-nhiều mối quan hệ trong Region để lập bản đồ RegionDescription 's cách bạn đã nêu ở trên.

+0

dụ liên kết không hoạt động được. Có thể bạn muốn cập nhật liên kết – Jyotirup

+1

@Jyotirup - tại đây chúng tôi truy cập http://docs.oracle.com/cd/B32110_01/web.1013/b28221/cmp30cfg001.htm – topchef

1

này nên điền nhu cầu của bạn:

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

Là một mặt lưu ý, tôi đã nhìn thấy rằng câu hỏi này là khá cũ. Nhưng nó không được đóng lại bằng cách nào đó. :-)

0

này nên làm việc:

@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; 
} 
Các vấn đề liên quan