3

(これが少し初心者の質問である場合は申し訳ありません)

2 つの JPAContainer があります。1 つは Employee クラス/テーブル用で、もう 1 つは 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 を選択/コンボ ボックスで使用すると、選択の値が POJO 自体ではなく、データベース内の行の ID になります。 Employee エンティティ POJO によって。コンボ ボックスに SingleSelectConverter を追加すると、問題が解決するはずです。

language.setConverter(new SingleSelectConverter(language));

...

HTH、/ジョナタン

于 2013-03-18T10:13:03.760 に答える
2

このトピックに関するブログ投稿を書きました: Select Nested JavaBeans With a Vaadin FieldGroup。この記事では、Vaadin の FieldGroup が内部でどのように機能し、どのようにItemプロパティをフィールド コンポーネントにバインドするかを説明しようとします。編集された に対して参照される JavaBean (Languageこの質問など)を選択しようとする場合、Itemこのプロパティ バインディングがどのように機能するか、およびそのバインディングをカスタムcom.vaadin.data.util.converter.Converter実装で支援する方法を知ることが重要です。SingleSelectConverterこれは、マイケルの回答から、この特定のケースでが必要な理由も説明しています。

于 2014-04-25T09:06:50.087 に答える