2010-11-25 2 views
5

Я хочу присоединиться к двум таблицам в столбце «поставщик», В таблице счетов-фактур тип поставщика целых чисел, в таблице поставщиков поставщик - тип varchar (10).JPA определяет отношения в поле, которое требует преобразования типов

Можно ли преобразовать тип и также иметь отношения?

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

ответ

0

Может быть, это можно сделать с помощью переходного поля

@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

Насколько я знаю, с помощью сводной таблицы (как вы могли бы сделать, чтобы представить многие-ко многие отношения) было бы правильным способом сделать это.

Что-то, как это должно работать:

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

Где таблица invoice_vendor имеет целочисленный идентификатор в столбце идентификатора и ссылки VARCHAR в VENDOR_ID колонке.

Кроме того, я предполагаю, что вам нужны отношения ManyToOne между поставщиками, но вы написали один к одному, поэтому я оставил это как таковое.

+0

Да я полагаю, что это будет работать, но я не доволен, имеющий дополнительную таблицу. Причина, по которой я добавил щедрость, на самом деле потому, что я хотел бы делать скопления, такие как AVG() над текстовым полем, и я предположил, что ответ на этот вопрос также решит мою проблему. Я думаю, @Transient будет работать, но я все равно должен его протестировать. Спасибо, я подарю вам щедрость, если не получу лучшего ответа. – AmanicA 2011-03-19 19:58:53

0

Какой поставщик JPA вы используете?

Кажется, что Hibernate имеет отдельную аннотацию к этому (@JoinColumnsOrFormula). Насколько я знаю, EclipseLink не предлагает эту аннотацию.

See related question on stackoverflow