2017-10-06 1 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는이를 고객 customerId로 매핑했지만 고객 클래스의 객체를 바인딩 할 수 없으며이를 무언가로 변환해야합니까? – revolt

+1

고객 개체로 무엇을하고 싶습니까? 레이블에 customer_id 값을 표시하고 드롭 다운을 표시하여 새 연결을 만들거나 다른 것을 만드시겠습니까? – Mika

답변

1

옵션 1 : 변환 내가 Customer 클래스에 해당 ID 필드를 가정하고 여기에

고객 ID는 id라고하며 유형 Long의 것입니다. 이렇게하면 포맷되지 않은 문자열 프리젠 테이션을 생성하는 변환기를 통해 해당 ID 필드에 액세스 할 수 있습니다. 이 경우 null 값을 올바르게 처리하지 못합니다.

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

옵션 2 : 변환 고객 대상이 예제는 고객 객체를 가지고 고객 ID 필드에 원하는 형식으로 그 변환 할

. 이를 통해 null 값을 처리하고 전체 개체의 상태를 기반으로보다 고급 서식을 지정할 수 있습니다. 당신이 ID 값 사용자 유형에서 고객 객체를 생성하지 않아야하기 때문에

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

당신은 컨버터 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 fkCustomerId = new TextField(); 
fkCustomerId.addStyleName(ValoTheme.TEXTFIELD_BORDERLESS); 
fkCustomerId.setReadOnly(true);