Fill ComboBox with data from a table

I am using javaEE with wildfly and Vaadin 8.

In the Backend I have the following 2 entities:

@Entity
@Table(name = "ACCOUNT")
public class Account implements Serializable {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id;

	private String username;

	@NotNull
	private String password;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ACCOUNTGROUP_ID")
	private AccountGroup accountGroup;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public AccountGroup getAccountGroup() {
		return this.accountGroup;
	}

	public void setAccountGroup(final AccountGroup accountGroup) {
		this.accountGroup = accountGroup;
	}
}
@Entity
@Table(name = "ACCOUNTGROUP")
public class AccountGroup implements Serializable {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id;

	@NotNull
	private String name;
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

In the Frontend I want now show/edit the Account by a Grid with a ComboBox.

@CDIView(MainView.ACCOUNT_VIEW)
public class AccountView extends VerticalLayout implements View {

	@Inject
	AccountService service;

	@Inject
	AccountGroupService acountGroupService;

	private Account entry;
	private Set<Account> selected;
	private Account selectedEntry;
	private TextField txfUsername = new TextField();
	private TextField txfPassword = new TextField();
	private ComboBox <AccountGroup>cbxAccountGroup = new ComboBox<>();

	public AccountView() {
		setSizeFull();
		setSpacing(true);
		addComponent(new TopMainMenu());
		addComponent(new Label("Account View"));
	}

	@Override
	public void enter(ViewChangeEvent event) {
		Notification.show("Showing view: Account View");
	}

	@PostConstruct
	void init() {
		selected = new HashSet<>();
		List<Account> list = service.getAllAccount();
		DataProvider<Account, ?> dataProvider = DataProvider.ofCollection(list);
		Grid<Account> grid = new Grid<Account>();
		grid.setSelectionMode(SelectionMode.MULTI);
		grid.addSelectionListener(event -> {
			selected = event.getAllSelectedItems();
		});

		grid.getEditor().setEnabled(true);
		grid.getEditor().addSaveListener(event -> {
			entry = event.getBean();
			updateRow(service, entry, grid);
		});

		cbxAccountGroup.setItems(acountGroupService.getAllAccountGroup());
		
		grid.setDataProvider(dataProvider);
		grid.addColumn(Account::getUsername).setCaption("Users Name").setEditorComponent(txfUsername,
				Account::setUsername);
		grid.addColumn(Account::getPassword).setCaption("Password").setEditorComponent(txfPassword,
				Account::setPassword);
		grid.addColumn(Account::getAccountGroup).setCaption("Account Group").setEditorComponent(cbxAccountGroup,
				Account::setAccountGroup);

		addComponent(grid);
	}

	private void updateRow(AccountService service, Account entry, Grid<Account> grid) {
		service.update(entry);
		refreshGrid(grid, service);
	}

	private void refreshGrid(Grid<Account> grid, AccountService service) {
		List<Account> list = service.getAllAccount();
		grid.setItems(list);
	}
}

Can you please give me some advice how to show the name of AccountGroup in the ComboBox cbxAccountGroup of the Grid?

If you simply want to change the captions of the items in the ComboBox, you can use [setItemCaptionGenerator]
(https://vaadin.com/download/release/8.4/8.4.1/docs/api/com/vaadin/ui/ComboBox.html#setItemCaptionGenerator-com.vaadin.ui.ItemCaptionGenerator-).

Thanks, now i have solved a part of the problem.
I use the following code:

@CDIView(MainView.PERSON_VIEW)
public class PersonView extends VerticalLayout implements View {

	@Inject
	NaturalPersonService service;

	@Inject
	TitleService titleService;

	private NaturalPerson entry;
	private Set<NaturalPerson> selected;
	private NaturalPerson selectedEntry;
	private TextField txfFirstName = new TextField();
	private TextField txfLastName = new TextField();
	private TextField txfComment = new TextField();
	private ComboBox<Title> cbxTitle = new ComboBox<>();

	public PersonView() {
		setSizeFull();
		setSpacing(true);
		addComponent(new TopMainMenu());
		addComponent(headingLabel());
}

	@PostConstruct
	void init() {
		selected = new HashSet<>();
		List<NaturalPerson> list = service.getAllNaturalPerson();
		list.sort(Comparator.comparing(NaturalPerson::getLastName));
		
		List<Title> titleList = titleService.getAllTitle();
		titleList.sort(Comparator.comparing(Title::getListPrio));

		DataProvider<NaturalPerson, ?> dataProvider = DataProvider.ofCollection(list);
		Grid<NaturalPerson> grid = new Grid<NaturalPerson>();
		grid.setSelectionMode(SelectionMode.MULTI);
		grid.addSelectionListener(event -> {
			selected = event.getAllSelectedItems();
		});

		grid.getEditor().setEnabled(true);
		grid.getEditor().addSaveListener(event -> {
			entry = event.getBean();
			updateRow(service, entry, grid);
		});

		cbxTitle.setPageLength(8);
		cbxTitle.setEmptySelectionAllowed(true);
		cbxTitle.setItemCaptionGenerator(Title::getTitle);
		cbxTitle.setItems(titleList);

		grid.setDataProvider(dataProvider);
		grid.addColumn(NaturalPerson::getFirstName).setCaption("First Name").setEditorComponent(txfFirstName,
				NaturalPerson::setFirstName);
		grid.addColumn(NaturalPerson::getLastName).setCaption("Last Name").setEditorComponent(txfLastName,
				NaturalPerson::setLastName);
		grid.addColumn(NaturalPerson::getTitle).setCaption("Titel").setEditorComponent(cbxTitle,
				NaturalPerson::setTitle);
		grid.addColumn(NaturalPerson::getComment).setCaption("Comment").setEditorComponent(txfComment,
				NaturalPerson::setComment);

		Button add = new Button("+");
		add.addClickListener(event -> addRow(service, grid));

		Button delete = new Button("-");
		delete.addClickListener(event -> deleteRow(service, selected, grid));

		Button details = new Button("details");
		details.addClickListener(event -> showDetails(service, selected, grid));

		HorizontalLayout tb = new HorizontalLayout(add, delete, details);
		addComponent(grid);
		addComponent(tb);
	}
.....

When i select now an Entry in the ComboBox “cbxTitle”, the values are shown correct.

But in the grid, i see something like this:

org.app.entity.Title@1eb77c155

How can i change this?

In this line of your code:

		grid.addColumn(NaturalPerson::getTitle).setCaption("Titel").setEditorComponent(cbxTitle,
				NaturalPerson::setTitle);

If you want to preserve NaturalPerson::getTitle as the column model, you can use one of the [setRenderer]
(https://vaadin.com/download/release/8.4/8.4.1/docs/api/com/vaadin/ui/Grid.Column.html#setRenderer-com.vaadin.ui.renderers.Renderer-) methods. The method with the presentationProvider also states its purpose in the API documentation as follows:

“The presentation provider is a method that takes the value of this column on a single row, and maps that to a value that the renderer accepts. This feature can be used for storing a complex value in a column for editing, but providing a simplified presentation for the user when not editing.”

So you could use that in conjunction with new TextRenderer() to display the field of org.app.entity.Title you want.

Thanks
how can i implement then the code with:

grid.addColumn(NaturalPerson::getTitle).setCaption("Titel").setEditorComponent(cbxTitle,
				NaturalPerson::setTitle).setRenderer(renderer);

can you give me please some more advise?

I think what you are looking for is:

import com.vaadin.ui.renderers.TextRenderer;
		
		...

		grid.addColumn(NaturalPerson::getTitle)
		    .setCaption("Title")
			.setRenderer(Title::getTitle, new TextRenderer())
		    .setEditorComponent(cbxTitle, NaturalPerson::setTitle);

a lot of thanks.
Now it works!!!

Sorry when i come back:
but i get now the following error:

13:49:18,436 SEVERE [com.vaadin.server.DefaultErrorHandler]
 (default task-9) : java.lang.NullPointerException
	at com.vaadin.ui.Grid$Column.generateRendererValue(Grid.java:1042)
	at com.vaadin.ui.Grid$Column.access$1100(Grid.java:831)
	at com.vaadin.ui.Grid$Column$1.generateData(Grid.java:862)
	at com.vaadin.data.provider.DataCommunicator.getDataObject(DataCommunicator.java:449)
	at com.vaadin.data.provider.DataCommunicator.pushData(DataCommunicator.java:429)
	at com.vaadin.data.provider.DataCommunicator.sendDataToClient(DataCommunicator.java:342)
	at com.vaadin.data.provider.DataCommunicator.beforeClientResponse(DataCommunicator.java:311)
	at com.vaadin.server.communication.UidlWriter.write(UidlWriter.java:126)
	at com.vaadin.server.communication.UIInitHandler.getInitialUidl(UIInitHandler.java:293)
	at com.vaadin.server.communication.UIInitHandler.synchronizedHandleRequest(UIInitHandler.java:82)
	at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40)
	at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1601)
	at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:445)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
	at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
	at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
	at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
	at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
	at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
	at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
	at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
	at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
	at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
	at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)
	at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
	at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
	at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
	at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
	at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
	at org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)
	at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508)
	at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508)
	at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508)
	at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508)
	at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508)
	at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
	at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
	at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
	at io.undertow.server.Connectors.executeRootHandler(Connectors.java:326)
	at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:812)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)

13:49:20,733 SEVERE [com.vaadin.server.DefaultErrorHandler]
 (default task-11) : java.lang.NullPointerException
	at com.vaadin.ui.Grid$Column.generateRendererValue(Grid.java:1042)
	at com.vaadin.ui.Grid$Column.access$1100(Grid.java:831)
	at com.vaadin.ui.Grid$Column$1.generateData(Grid.java:862)
	at com.vaadin.data.provider.DataCommunicator.getDataObject(DataCommunicator.java:449)
	at com.vaadin.data.provider.DataCommunicator.pushData(DataCommunicator.java:429)
	at com.vaadin.data.provider.DataCommunicator.sendDataToClient(DataCommunicator.java:342)
	at com.vaadin.data.provider.DataCommunicator.beforeClientResponse(DataCommunicator.java:311)
	at com.vaadin.server.communication.UidlWriter.write(UidlWriter.java:126)
	at com.vaadin.server.communication.UidlRequestHandler.writeUidl(UidlRequestHandler.java:124)
	at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:92)
	at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40)
	at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1601)
	at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:445)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
	at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
	at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
	at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
	at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
	at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
	at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
	at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
	at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
	at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
	at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)
	at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
	at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
	at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
	at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
	at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
	at org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)
	at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508)
	at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508)
	at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508)
	at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508)
	at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508)
	at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
	at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
	at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
	at io.undertow.server.Connectors.executeRootHandler(Connectors.java:326)
	at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:812)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)

My Code is:

		cbxTitle.setPageLength(8);
		cbxTitle.setEmptySelectionAllowed(true);
		cbxTitle.setItemCaptionGenerator(Title::getTitleValue);
		cbxTitle.setItems(titleList);

		grid.setDataProvider(dataProvider);
		grid.addColumn(NaturalPerson::getFirstName).setCaption("First Name").setEditorComponent(txfFirstName,
				NaturalPerson::setFirstName);
		grid.addColumn(NaturalPerson::getLastName).setCaption("Last Name").setEditorComponent(txfLastName,
				NaturalPerson::setLastName);
		grid.addColumn(NaturalPerson::getTitle).setCaption("Title").setRenderer(Title::getTitleValue, new TextRenderer())
				.setEditorComponent(cbxTitle, NaturalPerson::setTitle);

If NaturalPerson::getTitle can be null you will need to implement a null-check for the renderer’s presentation provider.

For example:

.setRenderer(title -> title != null ? title.getTitleValue() : null, new TextRenderer())