2017-10-06 68 views
0

我正在使用Vaadin和EclipseLink。有兩個表,一個是郵件,第二個在客戶。客戶的PK是customer_id,郵件的PK是mail_id。 表郵件具有Customer_id作爲外鍵。我如何綁定它? 我想:在Vaadin中綁定外鍵(EclipseLink)

binder.forField(fkCustomerId) 
     .withConverter(new StringToBigDecimalConverter(FormMessages.NUMBERS_ONLY)) 
     .bind(Mail::getCustomerId, Mail::setCustomerId); 

然後我檢查了郵件,實體類和發現

@JoinColumn(name = "CUSTOMER_ID", referencedColumnName = "CUSTOMER_ID") 
@ManyToOne 
private Customer customerId; 

我檢查這個頁面 - https://vaadin.com/docs/v8/framework/datamodel/datamodel-forms.html但沒有什麼關於FK結合。

+1

這將是很好的添加更多關於你想做什麼的信息。您可能不希望允許用戶直接編輯您的主鍵。它可能應該基於除用戶輸入外的其他設置。 – Mika

+0

表郵件包含其他應用程序的客戶的一些郵件設置,並且包含customer_id作爲外鍵。 EclipseLink將其映射爲Customer customerId,但我無法綁定Customer類的對象,是否需要將其轉換爲某種東西? – revolt

+1

你想用客戶對象做什麼?你想在標籤中顯示customer_id值,顯示下拉菜單以創建新連接或其他內容? – Mika

回答

1

選項1:將客戶ID

在這裏,我假設客戶類ID字段被稱爲id,它是Long類型。這允許您通過轉換器訪問該ID字段,以生成未格式化的字符串表示。請注意,這並不能很好地處理null的值。

binder.forField(fkCustomerId) 
     .withConverter(Long::valueOf, String::valueOf) 
     .bind("customerId.id"); 

選項2:轉換客戶對象

這個例子將採取客戶對象,並將其轉換成所需的格式爲客戶ID字段。這使您可以處理null值,並根據整個對象的狀態執行更高級的格式設置。

binder.forField(fkCustomerId) 
     .withConverter(new CustomerToCustomerIdConverter()) 
     .bind(Mail::getCustomerId, Mail::setCustomerId); 

您可以在轉換器省略convertToModel的結果,因爲你不應該從用戶類型的ID值,創造客戶對象。

public class CustomerToCustomerIdConverter implements Converter<String, Customer> { 
    @Override 
    public Result<Customer> convertToModel(String s, ValueContext valueContext) { 
     return Result.error("not supported"); 
    } 

    @Override 
    public String convertToPresentation(Customer customer, ValueContext valueContext) { 
     return Objects.toString(customer.getCustomerId(), ""); 
    } 
} 

文本字段風格

爲了設置TextField的風格,你需要將其設置爲只讀模式。如果你不想獲得文本字段邊框,那麼你需要添加額外的樣式。

TextField fkCustomerId = new TextField(); 
fkCustomerId.addStyleName(ValoTheme.TEXTFIELD_BORDERLESS); 
fkCustomerId.setReadOnly(true);