2009-04-16 18 views
5

devo tabella REGIONE:Come mappare la chiave composita dell'entità in JPA?

REG { 
    id number, 
    dateCreation Date 
    } 

Ho una tabella LOCALE:

LOCALE { 
    locale String 
    } 

Ho una tabella REGION_DESCRIPTION:

REGION_DESCRIPTION { 
    locale String, 
    regId number, 
    description 
    } 

REGION_DESCRIPTION ha una chiave composta: locale è un chiave esterna che punta alla tabella LOCALE. E regId punta alla tabella REGION.

Vorrei mappare questo per la mia classe java Regione:

private List<RegionDescription> descriptions; 

ho provato diverse approache in JPA. Ma non riesco a far funzionare la mappatura. Eventuali suggerimenti?

risposta

2

Si ha un caso di una tabella di join (REGION_DESCRIPTION) che diventa un'entità portando i propri attributi. Vorrei suggerire il seguente:

  1. definiscono RegionDescription come entità completa con composito classe di chiave primaria, vedi example;

  2. definire 2 relazioni molti-a-uno in RegionDescription: RegionDescription-Regione e RegionDescription-Locale.

  3. alternativa o in aggiunta definire relazione uno-a-molti in Regione per mappare RegionDescription s' il modo in cui specificato sopra.

+0

esempio di collegamento non è un lavoro. Forse vuoi aggiornare il link – Jyotirup

+1

@Jyotirup - qui andiamo http://docs.oracle.com/cd/B32110_01/web.1013/b28221/cmp30cfg001.htm – topchef

1

Questo dovrebbe riempire le vostre esigenze:

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

Come nota a margine, ho visto che questa domanda è abbastanza vecchio. Ma non è chiuso in qualche modo. :-)

0

Questo dovrebbe funzionare:

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