2010-11-25 41 views
5

Je veux joindre deux tables sur la colonne "fournisseur", Dans le type de fournisseur de table de facture est entier, dans la table fournisseur, le fournisseur est de type varchar (10).JPA définir relation sur un champ qui nécessite la conversion de type

Est-il possible de faire une conversion de type et d'avoir une relation?

@Entity 
public class Vendor 
{ 
    private String id; 

    @Id(Column="vendor") 
    public String getId(){ ... } 
} 

@Entity 
public class Invoice 
{ 
    private Vendor vendor; 

    @One-to-one 
    public Vendor getVendor() { ... } 
} 

Répondre

0

Peut-être que cela peut être fait en utilisant un champ transitoire

@Entity 
public class Employee { 
    ... 
    private boolean isActive; 
    ... 
    @Transient 
    public boolean getIsActive() { 
     return isActive; 
    } 
    public void setIsActive(boolean isActive) { 
     this.isActive = isActive; 
    } 
    @Basic 
    private String getIsActiveValue() { 
     if (isActive) { 
      return "T"; 
     } else { 
      return "F"; 
     } 
    } 
    private void setIsActiveValue(String isActive) { 
     this.isActive = "T".equals(isActive); 
    } 
} 

http://en.wikibooks.org/wiki/Java_Persistence/Basic_Attributes#Conversion

1

Pour autant que je sache, à l'aide d'un tableau croisé dynamique (comme vous le feriez pour représenter un nombre-to beaucoup de relations) serait la bonne façon de le faire.

Quelque chose comme cela devrait fonctionner:

@Entity 
public class Invoice 
{ 
    @JoinTable(name = "invoice_vendor", joinColumns = { 
     @JoinColumn(name = "invoice", referencedColumnName = "vendor_id")}, inverseJoinColumns = { 
     @JoinColumn(name = "vendor", referencedColumnName = "id")}) 
    @OneToOne 
    private Vendor vendor; 
} 

Lorsque la table invoice_vendor a l'ID entier dans la colonne identifiant et référence varchar dans la colonne vendor_id.

Aussi je suppose que vous souhaitez une relation ManyToOne entre les fournisseurs, mais vous avez écrit un à un, donc je l'ai laissé en tant que tel.

+0

Oui, je suppose que cela fonctionnera, mais je ne suis pas heureux d'avoir une table supplémentaire. La raison pour laquelle j'ai ajouté une prime est en fait parce que je voudrais faire des agrégations comme AVG() sur un champ de texte, et j'ai supposé que la réponse à cette question résoudrait aussi mon problème. Je pense que @Transient fonctionnera, mais je dois encore le tester. Merci, je vais vous donner la prime si je ne reçois pas de meilleures réponses. – AmanicA

+0

@AmanicA Cette solution fonctionnerait pour mapper un type donné dans le code à une colonne typée différemment dans la base de données (comme un champ enum dans une colonne de texte) mais je ne pense pas que vous puissiez définir une colonne jointe de cette façon. Je ne suis pas sûr si les convertisseurs d'EclipseLink ou d'Hibernate fonctionnent aussi avec des relations, j'expérimenterai ceci cependant. – mcyalcin

0

Quel fournisseur JPA utilisez-vous?

Il semble que Hibernate possède une annotation distincte pour cela (@JoinColumnsOrFormula). À ma connaissance, EclipseLink n'offre pas cette annotation.

See related question on stackoverflow