在Vaadin中绑定外键(EclipseLink)

时间:2017-10-06 11:10:41

标签: java jpa eclipselink vaadin

我正在使用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);

然后我检查了邮件实体类并找到了

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

我查看了这个页面 - https://vaadin.com/docs/v8/framework/datamodel/datamodel-forms.html但是没有关于fk绑定的内容。

1 个答案:

答案 0 :(得分:1)

选项1:转换客户ID

这里我假设Customer类上的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);

您可以在转换器中省略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样式,您需要将其设置为只读模式。如果您根本不想获得文本字段边框,则需要添加额外的样式。

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