JPA relationship JPAContainer with ComboBox?

前端 未结 2 1492
猫巷女王i
猫巷女王i 2021-01-26 09:24

I\'m looking for a way to use a jpa relationship @OneToMany/@OneToOne/@ManyToOne/@ManyToMany with a ComboBox.

@Entity
public class State {

    @Id
    @Generat         


        
相关标签:
2条回答
  • 2021-01-26 09:54

    A straight forward solution:

    BeanItemContainer<State> container = new BeanItemContainer<State>(State.class);
    
    final BeanFieldGroup<State> binder = new BeanFieldGroup<State>(State.class);
    binder.setFieldFactory(new DefaultFieldGroupFieldFactory() {
    
        @SuppressWarnings("unchecked")
        @Override
        public <T extends Field> T createField(Class<?> type, Class<T> fieldType) {
    
            if (type.isAssignableFrom(Governor.class) && fieldType.isAssignableFrom(ComboBox.class)) {
                return (T) new ComboBox(); // we create a ComboBox for the Governor property
            }
    
            return super.createField(type, fieldType);
        }
    
    });
    
    final State bean = new State();
    
    Field<?> field = null;
    binder.setItemDataSource(bean);
    
    binder.buildAndBind("State", "state");
    field = binder.buildAndBind("Governor", "governor", ComboBox.class);
    
    ComboBox cmbx = (ComboBox) field;
    
    // We define a container data source for your Governors.
    // I've taken the BeanItemContainer
    cmbx.setContainerDataSource(new BeanItemContainer<Governor>(Governor.class));
    
    // If you want to use a JPAContainer you need to translate entities to identifiers and visa versa
    // cmbx.setContainerDataSource(dsGovernor);
    // cmbx.setConverter(new SingleSelectConverter<Governor>(cmbx));
    cmbx.setItemCaptionPropertyId("governor");
    
    // we create two dummy Governors
    Governor governorA = new Governor();
    governorA.setGovernor("A");
    Governor governorB = new Governor();
    governorB.setGovernor("B");
    
    // ... and add them to the container
    cmbx.getContainerDataSource().addItem(governorA);
    cmbx.getContainerDataSource().addItem(governorB);
    
    // when the binder is committed the value of the ComboBox ( getValue() )is mapped to our state bean.
    
    0 讨论(0)
  • 2021-01-26 10:01

    This question is related to another question on Stackoverflow: Vaadin 7.0.1 Combobox with JPAContainer and FieldGroup.

    I wrote a blog post about this topic which explains how FieldGroups work internally and how you can make them work for this particular use case: Select Nested JavaBeans With a Vaadin FieldGroup. This post will also explain why a ConversionException is thrown in your example.

    Of course you could switch to using a BeanItemContainer, but by using a simple Converter implementation you can use any Container implementation as data source for your ComboBox. See the blog post for details.

    0 讨论(0)
提交回复
热议问题