86 votes

Comment définir une relation unidirectionnelle OneToMany dans JPA ?

J'ai un problème avec le mapping d'entités dans JPA. J'ai deux entités, la première est Lookup et la seconde est Text qui représente les traductions pour les entités. J'ai besoin de lier Lookup à Text mais je ne veux pas que Text fasse référence à Lookup. Pour compliquer les choses, le texte n'utilise pas sa clé primaire dans cette relation, mais un métacode défini dans un fichier TXTHEAD_CODE colonne.

Lookup.java

@Entity
@Table(name = "DATREG")
public class Lookup implements PersistableEntity {

    @Id
    @Column(name = "DATREG_META_CODE")
    private String metaCode;

    @OneToMany
    @JoinTable(name="TXT", 
            joinColumns=@JoinColumn(name="DATREG_META_CODE", referencedColumnName="TXTHEAD_CODE"),
            inverseJoinColumns=@JoinColumn(name="DATREG_META_CODE"))
    private List<Text> text;

Text.java

@Entity
@Table(name = "TXT")
public class Text {

    @Id
    @Column(name = "TXT_ID")
    private Long id;

    @Column(name = "TXTHEAD_CODE")
    private String code;

J'ai donc essayé cette méthode (et quelques autres variantes), mais sans résultat. Je ne peux pas non plus créer de table de jointure dans la base de données et je ne veux pas lier le Lookup à ma classe de texte. Je n'ai pas pu créer de table de jointure dans la base de données et je ne veux pas lier le Lookup à ma classe de texte.

176voto

Tom Anderson Points 22456

Ma bible pour le travail sur le JPA est le Java Persistence wikibook . Il dispose d'un section sur l'unidirectionnel OneToMany qui explique comment procéder avec un @JoinColumn annotation. Dans votre cas, je pense que vous voudriez.. :

@OneToMany
@JoinColumn(name="TXTHEAD_CODE")
private Set<Text> text;

J'ai utilisé un Set plutôt qu'un List car les données elles-mêmes ne sont pas ordonnées.

Ce qui précède utilise un referencedColumnName contrairement à l'exemple du wikibook. Si cela ne fonctionne pas, essayez un exemple explicite :

@OneToMany
@JoinColumn(name="TXTHEAD_CODE", referencedColumnName="DATREG_META_CODE")
private Set<Text> text;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X