Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 绑定Vaadin中的外键(EclipseLink)_Java_Jpa_Eclipselink_Vaadin - Fatal编程技术网

Java 绑定Vaadin中的外键(EclipseLink)

Java 绑定Vaadin中的外键(EclipseLink),java,jpa,eclipselink,vaadin,Java,Jpa,Eclipselink,Vaadin,我用的是Vaadin和EclipseLink。共有两个表格,一个是邮件,第二个是客户。客户的PK是客户id,邮件的PK是邮件id。 表Mail将Customer_id作为外键。我该怎么装订呢? 我试过: 然后我检查了邮件实体类,发现 @JoinColumn(name = "CUSTOMER_ID", referencedColumnName = "CUSTOMER_ID") @ManyToOne private Customer customerId; 我查看了这一页,但是没有关于fk绑定的内

我用的是Vaadin和EclipseLink。共有两个表格,一个是邮件,第二个是客户。客户的PK是客户id,邮件的PK是邮件id。 表Mail将Customer_id作为外键。我该怎么装订呢? 我试过:

然后我检查了邮件实体类,发现

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

我查看了这一页,但是没有关于fk绑定的内容

选项1:转换客户ID

这里我假设Customer类上的ID字段被称为
ID
,它的类型是
Long
。这允许您通过生成无格式字符串表示的转换器访问该ID字段。请注意,这不能很好地处理
null

binder.forField(fkCustomerId)
        .withConverter(Long::valueOf, String::valueOf)
        .bind("customerId.id");
选项2:转换客户对象

本例将以Customer对象为例,并将其转换为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(), "");
    }
}

最好能添加更多关于您想做什么的信息。您可能不希望允许用户直接编辑您的主键。它可能应该基于用户输入以外的内容进行设置。表Mail包含其他应用程序的客户的一些邮件设置,并包含作为外键的客户id。EclipseLink将其映射为Customer customerId,但我无法绑定Customer类的对象,我需要将其转换为其他对象吗?您希望如何处理Customer对象?是否要在标签中显示customer_id值,显示下拉列表以创建新连接或其他内容?哦,是的,我想在标签中显示该值。我想它会像:binder.forField(fkCustomerId).bind(Mail::getCustomerId,Mail::setCustomerId)一样简单;但是不,它不是那样工作的
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);