簡體   English   中英

Vaadin 7.0.1 Combobox與JPAContainer和FieldGroup

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM