Data binding 将POJO的POJO绑定到组合框

Data binding 将POJO的POJO绑定到组合框,data-binding,vaadin7,Data Binding,Vaadin7,我的POJO有另一个POJO作为数据库中的字段实体。我已经能够绑定所有普通字段,但是我正在努力绑定这个实体字段 个人POJO: package net.sourceforge.javydreamercsw.msm.db; public class Person implements Serializable { private static final long serialVersionUID = 1L; @Id @TableGenerator(name = "PE

我的POJO有另一个POJO作为数据库中的字段实体。我已经能够绑定所有普通字段,但是我正在努力绑定这个实体字段

个人POJO:

package net.sourceforge.javydreamercsw.msm.db;

public class Person implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @TableGenerator(name = "PERSON_GEN",
            table = "SEQUENCES",
            pkColumnName = "SEQ_NAME",
            valueColumnName = "SEQ_NUMBER",
            pkColumnValue = "PERSON",
            allocationSize = 1,
            initialValue = 1000)
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "PERSON_GEN")
    @Basic(optional = false)
    @NotNull
    @Column(name = "id")
    private Integer id;
    @Basic(optional = false)
    @NotNull
    @Column(name = "attempts")
    private Integer attempts = 0;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45)
    @Column(name = "name")
    private String name;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45)
    @Column(name = "lastname")
    private String lastname;
    @Basic(optional = false)
    @NotNull
    @Size(min = 5, max = 45)
    @Column(name = "username")
    private String username;
    @Basic(optional = false)
    @NotNull
    @Size(min = 6, max = 45)
    @Column(name = "password")
    private String password;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 11)
    @Column(name = "ssn")
    private String ssn="XXX-XX-XXXX";
    @JoinColumn(name = "access_id", referencedColumnName = "id")
    @ManyToOne(optional = false)
    private Access accessId;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "person")
    private List<PersonHasService> personHasServiceList;
    @Basic(optional = false)
    @Column(name = "login")
    @Temporal(TemporalType.TIMESTAMP)
    private Date login;
}

我可以根据这个答案生成一个专栏:
package net.sourceforge.javydreamercsw.msm.db;

public class Access implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @TableGenerator(name = "ACCESS_GEN",
            table = "SEQUENCES",
            pkColumnName = "SEQ_NAME",
            valueColumnName = "SEQ_NUMBER",
            pkColumnValue = "ACCESS",
            allocationSize = 1,
            initialValue = 1000)
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "ACCESS_GEN")
    @Basic(optional = false)
    @NotNull
    @Column(name = "id")
    private Integer id;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45)
    @Column(name = "name")
    private String name;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "accessId")
    private List<Person> personList;
}
private void updateTableData() {
    List<Person> persons
            = new PersonJpaController(DataBaseManager.getEntityManagerFactory()).findPersonEntities();
    BeanItemContainer<Person> container = new BeanItemContainer<>(
            Person.class, persons);
    table.setContainerDataSource(container);

    table.setVisibleColumns("name", "lastname", "username", "ssn", "accessId");
    table.setColumnHeaders(new String[]{
        rb.getString("general.first.name"),
        rb.getString("general.last.name"),
        rb.getString("general.username"),
        rb.getString("general.ssn"),
        rb.getString("general.access")});
    table.sort(new Object[]{"name", "lastname"}, new boolean[]{
        true, true});
}
private void updateTableData() {
    List<Person> persons
            = new PersonJpaController(DataBaseManager.getEntityManagerFactory()).findPersonEntities();
    BeanItemContainer<Person> container = new BeanItemContainer<>(
            Person.class, persons);
    table.setContainerDataSource(container);

    table.setVisibleColumns("name", "lastname", "username", "ssn", "accessId");
    table.setColumnHeaders(new String[]{
        rb.getString("general.first.name"),
        rb.getString("general.last.name"),
        rb.getString("general.username"),
        rb.getString("general.ssn"),
        rb.getString("general.access")});
    table.addGeneratedColumn(rb.getString("general.access"), new RuleGenerator());
    table.sort(new Object[]{"name", "lastname"}, new boolean[]{
        true, true});
}
public class RuleGenerator implements Table.ColumnGenerator {

    @Override
    public Object generateCell(Table source, Object itemId, Object columnId) {
        Label label = new Label();
        label.setValue(rb.getString(((Person) itemId).getAccessId().getName()));
        return label;
    }
}