[英]Vaadin 7.0.1 Combobox with JPAContainer and FieldGroup
(對不起,如果這是一個新問題)
我有兩個JPAContainers,一個用於Employee類/表,一個用於Language類/表。 員工可以選擇一種語言。
我正在嘗試創建一個Employee編輯表單,其中包含用於語言選擇的組合框和用於處理綁定和創建的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;
... }
我通過Vaadin論壇回答了這個問題得到了以下回復(感謝Jonatan Kronqvist)。
嗨邁克爾,
JPAContainer項ID與數據庫中的ID相同,這意味着在select / combo框中使用JPAContainer會導致select的值為數據庫中行的ID而不是POJO本身,如預期的那樣由您的員工實體POJO。 將SingleSelectConverter添加到組合框應該可以解決您的問題:
language.setConverter(new SingleSelectConverter(language));
...
HTH,/ Jonatan
我寫過一篇關於此主題的博客文章: 使用Vaadin FieldGroup選擇嵌套JavaBeans 。 在本文中,我將嘗試解釋Vaadin的FieldGroup如何在內部工作以及它如何將Item
屬性綁定到字段組件。 在嘗試為已編輯的Item
選擇引用的JavaBean(例如此問題中的Language
)的情況下,了解此屬性綁定的工作方式以及如何使用自定義com.vaadin.data.util.converter.Converter
協助綁定非常com.vaadin.data.util.converter.Converter
實現。 這也解釋了邁克爾的答案,為什么在這種特殊情況下你需要一個SingleSelectConverter
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.