带有 JPAContainer 和 FieldGroup 的 Vaadin 7.0.1 组合框 [英] Vaadin 7.0.1 Combobox with JPAContainer and FieldGroup

查看:27
本文介绍了带有 JPAContainer 和 FieldGroup 的 Vaadin 7.0.1 组合框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

(对不起,如果这是一个新手问题)

(Sorry if this is a bit of a newb question)

我有两个 JPAContainer,一个用于 Employee 类/表,另一个用于 Language 类/表.员工可以选择一种语言.

I have two JPAContainers, one for an Employee class/table and one for Language class/table. An employee can have a selected language.

我正在尝试创建一个带有组合框的员工编辑表单,用于语言选择和 FieldGroup 来处理绑定和创建.

I am trying to create an Employee editing form with a combobox for the language selection and FieldGroup to handle the binding and creation.

我可以通过 JPAContainer 获取下拉列表以包含 Languages 表中的条目,但它不会显示 Employee 记录中已有的值.我做错了什么?

I can get the drop down to include the entries from the Languages table via the JPAContainer but it will not display the value already in place in the Employee record. What am I doing wrong?

//Key parts of code....

private JPAContainer<Employee> employees;
private JPAContainer<Language> languages;

FormLayout formLayout = new FormLayout();

formFieldGroup = new FieldGroup(employeeItem);

Field<?> firstName = formFieldGroup.buildAndBind("First name", "firstName");
Field<?> lastName = formFieldGroup.buildAndBind("Last name", "lastName");
Field<?> userName = formFieldGroup.buildAndBind("Username", "userName");
Field<?> fullName = formFieldGroup.buildAndBind("Full name", "fullName");
Field<?> initials = formFieldGroup.buildAndBind("Initials", "initials");

ComboBox language = new ComboBox("Language",languages);
language.setContainerDataSource(languages);
language.setItemCaptionPropertyId("languageName");
language.setFilteringMode(FilteringMode.CONTAINS);
language.setImmediate(true);

formFieldGroup.bind(language, "language");

firstName.addValidator(new BeanValidator(Employee.class, "firstName"));
lastName.addValidator(new BeanValidator(Employee.class, "lastName"));
firstName.addValidator(new BeanValidator(Employee.class, "userName"));
lastName.addValidator(new BeanValidator(Employee.class, "fullName"));
lastName.addValidator(new BeanValidator(Employee.class, "initials"));

formLayout.addComponent(userName);
formLayout.addComponent(fullName);
formLayout.addComponent(firstName);
formLayout.addComponent(lastName);
formLayout.addComponent(initials);
formLayout.addComponent(language);

 // A few details of the domain classes
@Entity
@Table(name="Employees")
public class Employee   extends BaseEntity
{
private static final long   serialVersionUID    = 1L;

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="EmployeeID")
private Integer     employeeID;

    ...

@ManyToOne 
@JoinColumn(name="LanguageID",updatable=false)
private Language    language;
    ...}

@Entity
@Table(name="Languages")
public class Language  extends BaseEntity
{

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="LanguageID")
private Integer languageID;

@Column(name="LangaugeName")
private String  languageName;

    ... }

推荐答案

我通过 Vaadin 论坛收到了以下回复,回答了这个问题(感谢 Jonatan Kronqvist).

I received the following response via the Vaadin forums answering this question (Thanks to Jonatan Kronqvist).

迈克尔,

JPAContainer 项目 ID 与数据库中的 ID 相同,即意味着在选择/组合框中使用 JPAContainer 会导致值select 是数据库中行的 ID 而不是 POJO本身,正如您的 Employee 实体 POJO 所期望的那样.添加一个SingleSelectConverter 到您的组合框应该可以解决您的问题:

JPAContainer item IDs are the same as the ID in the database, which means that using a JPAContainer in a select/combo box causes the value of the select to be the ID of the row in the database and not the POJO itself, as is expected by your Employee entity POJO. Adding a SingleSelectConverter to your combo box should fix your problem:

language.setConverter(new SingleSelectConverter(language));

...

HTH,/乔纳坦

这篇关于带有 JPAContainer 和 FieldGroup 的 Vaadin 7.0.1 组合框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆