Свързващ външен ключ във Vaadin (EclipseLink)

Използвам Vaadin и EclipseLink. Има 2 таблици, едната е Mail, втората в Customer. PK за клиент е customer_id, PK за поща е mail_id. Table Mail има Customer_id като външен ключ. Как да го вържа? Опитах:

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

След това проверих класа Mail-entity и открих

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

Проверих тази страница - https://vaadin.com/docs/v8/framework/datamodel/datamodel-forms.html, но нямаше нищо за fk обвързване.


person revolt    schedule 06.10.2017    source източник
comment
Би било добре да добавите повече информация за това, което искате да правите. Вероятно не искате да позволите на потребителя да редактира директно вашия първичен ключ. Вероятно трябва да се настрои въз основа на нещо различно от потребителски вход.   -  person Mika    schedule 08.10.2017
comment
Таблица Mail съдържа някои настройки за поща за клиенти за друго приложение и съдържа customer_id като външен ключ. EclipseLink го картографира като Customer customerId, но не мога да обвържа обект от клас Customer, трябва ли да го конвертирам в нещо?   -  person revolt    schedule 09.10.2017
comment
Какво искате да направите с обекта на клиента? Искате ли да покажете стойността на customer_id в етикет, да покажете падащо меню за създаване на нова връзка или нещо друго?   -  person Mika    schedule 09.10.2017
comment
О, да, искам да покажа стойността в етикета.   -  person revolt    schedule 09.10.2017
comment
Мислех, че ще бъде толкова просто като: binder.forField(fkCustomerId) .bind(Mail::getCustomerId, Mail::setCustomerId); но не, не работи така   -  person revolt    schedule 09.10.2017


Отговори (1)


Опция 1: Преобразуване на клиентски идентификатор

Тук предполагам, че ID полето на клиентския клас се нарича id и че е от тип Long. Това ви позволява да получите достъп до това 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);

Можете да пропуснете convertToModelresult в преобразувателя, защото не трябва да създавате клиентски обекти от 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);
person Mika    schedule 09.10.2017