2009-04-16 12 views
5

Ich habe die Tabelle REGION:Wie wird der zusammengesetzte Schlüssel einer Entität in JPA abgebildet?

REG { 
    id number, 
    dateCreation Date 
    } 

ich eine LOCALE Tabelle haben:

LOCALE { 
    locale String 
    } 

Ich habe eine REGION_DESCRIPTION Tabelle:

REGION_DESCRIPTION { 
    locale String, 
    regId number, 
    description 
    } 

REGION_DESCRIPTION hat einen zusammengesetzten Schlüssel: locale ist ein Fremdschlüssel, der auf die LOCALE-Tabelle zeigt. Und regId zeigt auf die REGION-Tabelle.

würde Ich mag diese Java-Klasse meiner Region zur Karte:

private List<RegionDescription> descriptions; 

ich verschiedene versucht approache in JPA. Aber ich kann das Mapping nicht zum Laufen bringen. Irgendwelche Vorschläge?

Antwort

2

Sie haben den Fall, dass eine Join-Tabelle (REGION_DESCRIPTION) zu einer Entität wird, indem sie ihre eigenen Attribute trägt. Ich würde vorschlagen, die folgende:

  1. definieren RegionDescription als komplette Einheit mit Composite Primärschlüssel-Klasse finden Sie example;

  2. definieren 2 many-to-one-Beziehungen in RegionDescription: RegionDescription-Region und RegionDescription-Locale.

  3. alternativ oder zusätzlich definieren einer Eins-zu-viele-Beziehung in Region RegionDescription ‚s den Weg zur Karte Sie oben angegeben.

+0

Beispiel Link funktioniert nicht. Vielleicht möchten Sie den Link – Jyotirup

+1

@Jyotirup aktualisieren - hier gehen wir http://docs.oracle.com/cd/B32110_01/web.1013/b28221/cmp30cfg001.htm – topchef

1

Dies sollte Ihre Bedürfnisse füllen:

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

Als Seite beachten, ich habe gesehen, dass diese Frage ist ziemlich alt. Aber es ist irgendwie nicht geschlossen. :-)

0

Dies sollte funktionieren:

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