【问题标题】:Vaadin - How to bind a List of POJOVaadin - 如何绑定 POJO 列表
【发布时间】:2013-01-23 08:24:31
【问题描述】:

在 Vaadin 7 中,我试图将我的电话号码组合框绑定到嵌套在 POJO 中的 POJO 列表。 例如:我有 PersonVo,其中包含一个 List 电话; PersonCommunicationVo 包含电话号码的值。

我用来绑定PersonVo其他属性的是:

BeanFieldGroup<PersonVo>personBinder = new BeanFieldGroup<PersonVo>(PersonVo.class);
personBinder.setItemDataSource(person);
myFormLayout.addComponent(personBinder.buildAndBind("Firstname", "firstName"));
myFormLayout.addComponent(personBinder.buildAndBind("Country", "country.name"));

PersonVo:

@Table(name = "CONTACT.T_PERSON")
@Entity
@Audited
public class PersonVo {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id",updatable = false)
    private Long personId;

    @Column(name = "FIRSTNAME")
    private String firstName;

    @Column(name = "LASTNAME")
    private String lastName;

    @Column(name = "TITLE")
    private String title;

    ...

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "personId")
    @AuditMappedBy(mappedBy = "personId")
    private List<PersonCommunicationVo> **phoneNumbers**;

    ...

和 PersonCommunicationVo:

@Entity
@Table(name = "CONTACT.PERSON_COMMUNICATION")
@Audited

public class PersonCommunicationVo {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id",updatable = false)
    private Long persCommId;

    @Column(name = "PERSON_ID")
    private Long personId;


    @ManyToOne
    @JoinColumn(name = "COM_TYPE_ID")
    private CommunicationTypesVo communicationType;

    @Column(name = "VALUE")
    private String **value**;

我想做的是根据 PersonCommunicationVo 的 value 将我的电话号码组合框绑定到来自 PersonVo 的 phoneNumbers 列表。 但困难在于根据在组合框中选择的内容在列表中找到正确的 PersonCommunicationVo。例如:我在组合框中选择了电话号码 +32 123 456 789,该值应映射到 phoneNumbers.get(indexOfSelectedItem).getValue()。 为了更新电话号码,添加一个新的等等...

感谢您的帮助!

【问题讨论】:

    标签: list data-binding combobox vaadin pojo


    【解决方案1】:

    也许我不了解您的数据模型,如果是这样,您能否发布 PersonVo、PhoneVo(?) 和 PersonCommunicationVo 并进一步解释一下为什么要像您一样保存它。为什么您的 personvo 包含电话列表?我以前从未与 beanfieldgroup 合作过,但我想到了类似的东西:

    ComboBox cb = new ComboBox("Phones", person.getPhones())
    personBinder.bind(cb, "phones");
    myFormLayout.addComponent(cb);
    

    【讨论】:

    • 对不起,我的解释很差,英语不好。我编辑了问题:)
    • ComboBox 只有一项作为值,因此不能绑定到列表属性。我考虑过表格,但即使使用多选模式,您也需要选择所有元素。
    【解决方案2】:

    您可以尝试这样的事情(java 1.7 语法和 Vaadin7):

    ...
        FieldGroup fGroup = new FieldGroup( new BeanItem<PersonVo> (personInstance) );
    ...
        BeanItemContainer<PersonCommunicationVo> numbers = new BeanItemContainer<>( PersonCommunicationVo.class );
        numbers.addAll( personInstance.getPhoneNumbers() );
    
        ComboBox phoneCombo = new ComboBox( "Phone Numbers", numbers );
        phoneCombo.setItemCaptionMode( ItemCaptionMode.PROPERTY );
        phoneCombo.setItemCaptionPropertyId( "**value**" );
    
        fGroup.bind (phoneCombo, "**phoneNumbers**")
    
        myFormLayout.addComponent(phoneCombo);
    ...
    

    【讨论】:

    • ComboBox 只有一项作为值,因此不能绑定到列表属性。我考虑过表格,但即使使用多选模式,您也需要选择所有元素。
    猜你喜欢
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 2016-09-11
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多