2010-11-25 10 views
5

Quiero unir dos tablas en la columna "proveedor", En la tabla de facturas, el tipo de proveedor es entero; en la tabla de proveedores, el proveedor es varchar (10).JPA define la relación en un campo que requiere conversión de tipo

¿Es posible hacer una conversión de tipo y también tener una relación?

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

Respuesta

0

Tal vez esto se puede hacer usando un campo transitoria

@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

Por lo que yo sé, usando una tabla dinámica (como lo haría para representar una relación muchos-a- muchas relaciones) sería la forma correcta de hacerlo.

Algo como esto debería funcionar:

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

Cuando la mesa invoice_vendor tiene la Identificación del número entero en la columna ID y referencia en la columna varchar Vendor_id.

También supongo que desea una relación ManyToOne entre proveedores, pero ha escrito uno a uno, así que lo he dejado como tal.

+0

Sí supongo que esto va a funcionar, pero no estoy feliz con tener una mesa extra. La razón por la que agregué una recompensa es en realidad porque me gustaría hacer agregaciones como AVG() sobre un campo de texto, y asumí que la respuesta a esta pregunta también resolvería mi problema. Creo que @Transient funcionará, pero aún tengo que probarlo. Gracias, te recompensaré con la recompensa si no obtengo mejores respuestas. – AmanicA

+0

@AmanicA Esa solución funcionaría para asignar un tipo dado en el código a una columna de tipo diferente en la base de datos (como un campo enum a una columna de texto), pero no creo que pueda definir una joincolumn de esa manera. No estoy seguro de si los convertidores de EclipseLink o Hibernate también funcionan con las relaciones, voy a experimentar con eso ... – mcyalcin

0

¿Qué proveedor de JPA usas?

Parece que Hibernate tiene una anotación separada para esto (@JoinColumnsOrFormula). Que yo sepa, EclipseLink no ofrece esa anotación.

See related question on stackoverflow

Cuestiones relacionadas