web-dev-qa-db-fra.com

Comment définir une relation unidirectionnelle OneToMany dans JPA

J'ai un problème suivant avec le mappage d'entité dans JPA. J'ai deux entités, la première est Lookup et la seconde est Text, qui représente la traduction des entités. Maintenant, je dois lier Lookup au texte, mais je ne veux pas que le texte fasse référence à Lookup. Pour compliquer les choses, Text n'utilise pas sa clé primaire dans cette relation, mais un métacode défini dans un 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é cela (et quelques autres variantes) mais sans résultat. De plus, je ne peux pas créer de table de jointure dans la base de données et je ne souhaite pas que Lookup soit lié à ma classe Text. Alors quelqu'un peut-il me dire s'il existe un autre moyen?

62
Petr Mensik

Ma bible pour le travail JPA est le wikibook de Java Persistence . Il a un section sur unidirectionnel OneToMany qui explique comment faire cela 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 par défaut, contrairement à l'exemple du wikibook. Si cela ne fonctionne pas, essayez-en un explicitement:

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