2010-11-25 3 views
5

Ich möchte zwei Tabellen in Spalte "Kreditor", in Rechnung Rechnung Tabelle Kreditor Typ ist Integer, in Lieferantentabelle, Hersteller ist Typ Varchar (10).JPA definieren Beziehung in einem Feld, das Typ Konvertierung benötigt

Ist es möglich, eine Typumwandlung zu machen und auch eine Beziehung zu haben?

@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() { ... } 
} 

Antwort

0

Vielleicht kann dies mit Hilfe eines transienten Feld

@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

erfolgen
1

Soweit ich weiß, eine Pivot-Tabelle mit (wie Sie eine viele-vertreten tun würde viele Beziehungen) wäre der richtige Weg, dies zu tun.

So etwas sollte funktionieren:

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

Wo die invoice_vendor Tabelle, die die ganze Zahl id in Spalte id und varchar Referenz in vendor_id Spalte hat.

Auch ich vermute, Sie möchten eine ManyToOne Beziehung zwischen Anbietern, aber Sie haben eins zu eins geschrieben, also habe ich das als solche verlassen.

+0

Ja, ich nehme an, das wird funktionieren, aber ich bin nicht glücklich mit einer zusätzlichen Tabelle mit. Der Grund, warum ich ein Bounty hinzugefügt habe, ist, weil ich Aggregationen wie AVG() über ein Textfeld machen möchte, und ich nahm an, dass die Antwort auf diese Frage auch mein Problem lösen würde. Ich denke @Transient wird funktionieren, aber ich muss es noch testen. Danke, ich werde dir das Kopfgeld geben, wenn ich keine besseren Antworten bekomme. – AmanicA

+0

@AmanicA Diese Lösung würde für die Zuordnung eines bestimmten Typs im Code zu einer anders getippten Spalte in der Datenbank funktionieren (z. B. ein Enum-Feld in eine Textspalte), aber ich denke nicht, dass Sie auf diese Weise eine Join-Spalte definieren können. Ich bin mir nicht sicher, ob Konvertierer von EclipseLink oder Hibernate auch mit Beziehungen arbeiten, aber ich werde damit experimentieren. – mcyalcin

0

Welchen JPA-Anbieter verwenden Sie?

Es scheint, dass Hibernate eine separate Annotation für diese (@JoinColumnsOrFormula) hat. Soweit ich weiß, bietet EclipseLink diese Annotation nicht an.

See related question on stackoverflow