我正在使用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绑定的内容。
答案 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);