2009-04-16 7 views
5

I ont la table REGION:Comment mapper une clé composite d'entité dans JPA?

REG { 
    id number, 
    dateCreation Date 
    } 

j'ai une table LOCALE:

LOCALE { 
    locale String 
    } 

I ont une table de REGION_DESCRIPTION:

REGION_DESCRIPTION { 
    locale String, 
    regId number, 
    description 
    } 

REGION_DESCRIPTION dispose d'une clé composite: locale est un clé étrangère pointant vers la table LOCALE. Et regId pointe vers la table REGION.

Je voudrais mapper ce à ma classe java Région:

private List<RegionDescription> descriptions; 

J'ai essayé différents approache JPA. Mais je ne peux pas obtenir le mapping pour fonctionner. Aucune suggestion?

Répondre

2

Vous avez un cas où une table de jointure (REGION_DESCRIPTION) devient une entité en portant ses propres attributs. Je suggère ce qui suit:

  1. définissent RegionDescription comme une entité complète avec classe de clé primaire composite , voir example;

  2. définissent 2 many-to-one relations dans RegionDescription: RegionDescription-Région et RegionDescription-Locale.

  3. alternativement ou en plus de définir un à plusieurs dans Région à la carte le chemin de RegionDescription spécifié ci-dessus.

+0

exemple de lien est fonctionne pas. Peut-être que vous voulez mettre à jour le lien – Jyotirup

+1

@Jyotirup - ici nous allons http://docs.oracle.com/cd/B32110_01/web.1013/b28221/cmp30cfg001.htm – topchef

1

Cela devrait répondre à vos besoins:

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

Comme une note de côté, j'ai vu que cette question est assez vieux. Mais ce n'est pas fermé d'une manière ou d'une autre. :-)

0

Cela devrait fonctionner:

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