Ответ на вопрос: Как связать внешний ключ (или любое другое вложенное свойство) в текстовом поле (не то, что вам нужно!)
Вы можете сделать это, предоставив лямбда-выражениячтобы получить и установить вложенные свойства.
TextField clientId = new TextField("Client ID");
binder.forField(clientId)
.withConverter(new StringToLongConverter("error message"))
.bind(item -> item.getClient().getId(), (item, value) -> item.getClient().setId(value));
Этот код может быть причиной исключений NullPointerException, если у заказа не может быть клиента на данном этапе.Если это возможно, то используйте это вместо этого (добавлена проверка на нулевые значения):
TextField clientId = new TextField("Client ID");
binder.forField(clientId)
.withConverter(new StringToLongConverter("error message"))
.bind(
item -> item.getClient() != null ? item.getClient.getId() : null,
(item, value) -> {
if(item.getClient() != null){
item.getClient().setId(value);
}
});
Внимание! Помните, что ручное изменение значения в этом текстовом поле изменит идентификаториз него уже назначен клиент , а не выбирает / назначает нового клиента для этого заказа .Если это последнее, что вы хотите, используйте вместо этого ComboBox!Я не уверен, имеет ли смысл делать первое, но я ответил, потому что ты спросил.Теперь я уверен, что вам нужен последний вариант, поэтому, пожалуйста, следуйте следующей части.
Фактическое решение вашей проблемы: Кажется, вам действительно нужен ComboBox, потому чтоВы хотите выбрать / назначить клиента для заказа.
Итак, в основном вам нужно следующее:
ComboBox<Client> clientSelection = new ComboBox<Client>("client");
clientSelection.setItems(clientService.findAll()); // list/set of possible clients.
// Using clients name for item captions now, but you can also use id or both
clientSelection.setItemCaptionGenerator(Client::getName);
binder.forField(clientSelection)
.bind(Order::getClient, Order::setClient);
Таким образом, вы можете выбрать клиента, которыйзатем устанавливается как клиент связанных заказов.