2017-10-06 8 views
0

私はVaadinとEclipseLinkを使用しています。 2つのテーブルがあり、1つはメールで、の2番目に顧客です。顧客のPKはcustomer_id、メールのPKはmail_idです。 表Mailには、外部キーとしてのCustomer_idがあります。どのように私はそれをバインドするのですか? 私が試した: - https://vaadin.com/docs/v8/framework/datamodel/datamodel-forms.htmlが、結合FKについては何もありませんでした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; 

を見つけました。

+1

あなたがしたいことに関する詳細情報を追加するとよいでしょう。おそらく、ユーザーが主キーを直接編集することを許可したくない場合があります。おそらく、ユーザーの入力以外のものに基づいて設定する必要があります。 – Mika

+0

表Mailには、別のアプリケーションの顧客用のメール設定がいくつか含まれていて、外部キーとしてcustomer_idが含まれています。 EclipseLinkは顧客のcustomerIdとしてマッピングしましたが、クラスCustomerのオブジェクトをバインドできません。何かに変換する必要がありますか? – revolt

+1

顧客オブジェクトで何をしたいですか? customer_idの値をラベルに表示したり、ドロップダウンを表示して新しい接続を作成したりしたいですか? – Mika

答えて

1

オプション1:ここで私はCustomerクラスのIDフィールドがidと呼ばれていると仮定し、それがタイプLongであることをしていた顧客IDに

に変換します。これにより、フォーマットされていない文字列表示を生成するコンバータを介してIDフィールドにアクセスすることができます。これはnullの値をうまく処理しないことに注意してください。

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

オプション2:顧客オブジェクトが

変換この例では、Customerオブジェクトを取得し、顧客IDフィールドのために必要な形式にそれを変換します。これにより、nullの値を処理し、オブジェクト全体の状態に基づいてより高度な書式設定を行うことができます。

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

ユーザータイプIDの値から、顧客のオブジェクトを作成するべきではありませんので、あなたは、コンバータにconvertToModel結果を省略することができます。

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スタイルするためには、読み取り専用モードに設定する必要があります。また、テキストフィールドの境界線をすべて取得したくない場合は、余分なスタイルを追加する必要があります。

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