3

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

我有两个 JPAContainer,一个用于 Employee 类/表,一个用于 Language 类/表。员工可以使用选定的语言。

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

我可以通过 JPAContainer 获取下拉菜单以包含 Languages 表中的条目,但它不会显示 Employee 记录中已经存在的值。我究竟做错了什么?

//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;

    ... }
4

2 回答 2

10

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

嗨迈克尔,

JPAContainer 项目 ID 与数据库中的 ID 相同,这意味着在选择/组合框中使用 JPAContainer 会导致选择的值是数据库中行的 ID,而不是 POJO 本身,正如预期的那样通过您的员工实体 POJO。将 SingleSelectConverter 添加到组合框应该可以解决您的问题:

language.setConverter(new SingleSelectConverter(language));

...

HTH, /乔纳坦

于 2013-03-18T10:13:03.760 回答
2

我写了一篇关于这个主题的博客文章:选择带有 Vaadin FieldGroup 的嵌套 JavaBeans。在本文中,我尝试解释 Vaadin 的 FieldGroup 如何在内部工作以及它如何将Item属性绑定到字段组件。在尝试为已编辑的 选择引用的 JavaBean(例如Language在此问题中)的情况下Item,了解此属性绑定的工作原理以及如何通过自定义com.vaadin.data.util.converter.Converter实现协助该绑定非常重要。这也从迈克尔的回答中解释了为什么SingleSelectConverter在这种特殊情况下需要 a 。

于 2014-04-25T09:06:50.087 回答