2009-04-16 52 views
5

que tienen la tabla REGIÓN:¿Cómo mapear la clave compuesta de entidad en JPA?

REG { 
    id number, 
    dateCreation Date 
    } 

Tengo una tabla LOCALE:

LOCALE { 
    locale String 
    } 

Tengo una tabla REGION_DESCRIPTION:

REGION_DESCRIPTION { 
    locale String, 
    regId number, 
    description 
    } 

REGION_DESCRIPTION tiene una clave compuesta: locale es una clave externa que apunta a la tabla LOCALE. Y regId apunta a la tabla REGION.

me gustaría asignar esto a mi clase java Región:

private List<RegionDescription> descriptions; 

me trataron diferente approache en APP. Pero no puedo hacer que el mapeo funcione. ¿Alguna sugerencia?

Respuesta

2

Tiene una caja de una tabla de unión (REGION_DESCRIPTION) que se convierte en una entidad con sus propios atributos. Yo sugeriría lo siguiente:

  1. definen RegionDescription como una entidad completa con composite clase de clave primaria , ver example;

  2. definen 2 relaciones muchos-a-uno en RegionDescription: RegionDescription a Región y RegionDescription a Locale.

  3. alternativamente o además definir relación de uno a muchos en Región para mapear RegionDescription 's la forma ha especificado anteriormente.

+0

ejemplo Enlace no funciona. Tal vez quiera actualizar el enlace – Jyotirup

+1

@Jyotirup - aquí vamos http://docs.oracle.com/cd/B32110_01/web.1013/b28221/cmp30cfg001.htm – topchef

1

Esto debería llenar sus necesidades:

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

Como nota al margen, he visto que esta pregunta es bastante antiguo. Pero no está cerrado de alguna manera. :-)

0

Esto debería funcionar:

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