Thanks for your reply!
Tables are automatically generated from my classes:
Table benutzer: id, vorname, nachname, fachbereich_id
Table fachbereich: id, name
Here’s my code:
EntityManagerFactory factory = Persistence.createEntityManagerFactory("xxxPU");
final EntityManager em = factory.createEntityManager();
MutableLocalEntityProvider<Benutzer> myEntityProvider = new MutableLocalEntityProvider<Benutzer>(Benutzer.class, em);
MutableLocalEntityProvider<Fachbereich> fbMyEntityProvider = new MutableLocalEntityProvider<Fachbereich>(Fachbereich.class, em);
final EntityContainer<Benutzer> container = new JPAContainer<Benutzer>(Benutzer.class);
container.setEntityProvider(myEntityProvider);
final EntityContainer<Fachbereich> fbContainer = new JPAContainer<Fachbereich>(Fachbereich.class);
fbContainer.setEntityProvider(fbMyEntityProvider);
...
table.setContainerDataSource(container);
table.setVisibleColumns(new String[]{"id", "vorname", "nachname", "fachbereich"});
table.addListener(new Table.ValueChangeListener() {
public void valueChange(ValueChangeEvent event) {
Object value = event.getProperty().getValue();
if (value != null) {
EntityItem<Benutzer> benutzerItem = container.getItem(event.getProperty().getValue());
benutzerForm.setItemDataSource(benutzerItem);
benutzerForm.setVisibleItemProperties(new String[]{"vorname", "nachname", "fachbereich"});
Item item = table.getItem(value);
if (item.getItemProperty("fachbereich").getValue() != null) {
combo.setValue(benutzerItem.getEntity().getFachbereich().getId());
}
benutzerForm.getFooter().removeAllComponents();
mainWindow.addComponent(benutzerForm);
benutzerForm.getFooter().addComponent(apply);
} else {
mainWindow.removeComponent(benutzerForm);
}
}
});
...
final Form benutzerForm = new Form();
final Button apply = new Button("Save", new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
try {
benutzerForm.commit();
} catch (Exception e) {
// Ignored, we'll let the Form handle the errors
}
}
});
...
final ComboBox combo = new ComboBox("Fachbereich");
combo.setContainerDataSource(fbContainer);
combo.setItemCaptionPropertyId("name");
combo.setNullSelectionAllowed(false);
combo.setImmediate(true);
benutzerForm.setItemDataSource(benutzerItem); // bind to POJO via BeanItem
benutzerForm.setVisibleItemProperties(new String[]{"vorname", "nachname", "fachbereich"});
benutzerForm.setFormFieldFactory(new FormFieldFactory() {
@Override
public Field createField(Item item, Object propertyId, Component uiContext) {
Field field = DefaultFieldFactory.get().createField(item, propertyId, uiContext);
if ("vorname".equals(propertyId)) {
TextField tf = (TextField) field;
tf.setNullRepresentation("");
tf.setRequired(true);
tf.setRequiredError("Please enter a First Name");
tf.addValidator(new StringLengthValidator("First Name must be 3-25 characters", 3, 25, false));
} else if ("nachname".equals(propertyId)) {
TextField tf = (TextField) field;
tf.setNullRepresentation("");
tf.setRequired(true);
tf.setRequiredError("Please enter a Last Name");
tf.addValidator(new StringLengthValidator("Last Name must be 3-50 characters", 3, 50, false));
} else if ("fachbereich".equals(propertyId)) {
return combo;
}
return field;
}
});
@Entity
public class Fachbereich implements Serializable {
...
@OneToMany(mappedBy = "fachbereich", cascade={CascadeType.PERSIST, CascadeType.MERGE})
private List<Benutzer> benutzerliste;
@Id
@GeneratedValue
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
...
@Entity
public class Benutzer implements Serializable {
@Id
@GeneratedValue
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
...
@ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE})
private Fachbereich fachbereich;
/**
* @return the fachbereich
*/
public Fachbereich getFachbereich() {
return fachbereich;
}
/**
* @param fachbereich the fachbereich to set
*/
public void setFachbereich(Fachbereich fachbereich) {
this.fachbereich = fachbereich;
}
...
Your code seemed logical to me but didn’t work for some reason.
My Table displays all “Fachbereichs” correctly (I mean the name, not id) upon starting the application. But hitting apply creates a new “Fachbereich” named (name) like the id of the chosen “Fachbereich” in my edit form.
Thanks a lot!