Kombinacja Javafx z niestandardowym obiektem wyświetla adres obiektu, chociaż używana jest niestandardowa fabryka komórek

Mam combobox, który pokazuje listęUser przedmioty. Kodowałem niestandardową fabrykę komórek dla combobox:

@FXML ComboBox<User> cmbUserIds;
cmbUserIds.setCellFactory(new Callback<ListView<User>,ListCell<User>>(){
                @Override
                public ListCell<User> call(ListView<User> l){
                    return new ListCell<User>(){
                        @Override
                        protected void updateItem(Useritem, boolean empty) {
                            super.updateItem(item, empty);
                            if (item == null || empty) {
                                setGraphic(null);
                            } else {
                                setText(item.getId()+"    "+item.getName());
                            }
                        }
                    } ;
                }
            });

ListView pokazuje łańcuch (id + nazwa), ale kiedy wybieram element z listview, Combobox pokazuje wartość metody toString () zwracaną przez adres i.e obiektu. Nie mogę zastąpić metody toString (), ponieważ obiekt domeny użytkownika powinien być taki sam jak ten na serwerze. Jak wyświetlić identyfikator w combobox? Proszę zasugeruj

EDIT1

Próbowałem poniżej kodu. Teraz pole kombi pokazuje id, gdy wybieram wartość z widoku listy.

cmbUserIds.setConverter(new StringConverter<User>() {
              @Override
              public String toString(User user) {
                if (user== null){
                  return null;
                } else {
                  return user.getId();
                }
              }

            @Override
            public User fromString(String id) {
                return null;
            }
        });

Wybrana wartość w polu kombi zostanie wyczyszczona, gdy utracona zostanie kontrola ostrości. Jak to naprawić?

EDIT2:

@FXML AnchorPane root;
@FXML ComboBox<UserDTO> cmbUsers;
List<UserDTO> users;
public class GateInController implements Initializable {
@Override   
public void initialize(URL location, ResourceBundle resources) {
        users = UserService.getListOfUsers();
        cmbUsers.setItems(FXCollections.observableList(users));
        cmbUsers.getSelectionModel().selectFirst();
        // list of values showed in combo box drop down
        cmbUsers.setCellFactory(new Callback<ListView<UserDTO>,ListCell<UserDTO>>(){
            @Override
            public ListCell<UserDTO> call(ListView<UserDTO> l){
                return new ListCell<UserDTO>(){
                    @Override
                    protected void updateItem(UserDTO item, boolean empty) {
                        super.updateItem(item, empty);
                        if (item == null || empty) {
                            setGraphic(null);
                        } else {
                            setText(item.getUserId()+"    "+item.getUserNm());
                        }
                    }
                } ;
            }
        });
        //selected value showed in combo box
        cmbUsers.setConverter(new StringConverter<UserDTO>() {
              @Override
              public String toString(UserDTO user) {
                if (user == null){
                  return null;
                } else {
                  return user.getUserId();
                }
              }

            @Override
            public UserDTO fromString(String userId) {
                return null;
            }
        });
    }
}

questionAnswers(2)

yourAnswerToTheQuestion