Ow yeah... Looks like I can get away with this : === ProductEdit.html ===
<form wicket:id="productEditForm"> <table width="100%" cellpadding="0" cellspacing="5"> <tr valign="top" wicket:id="productDetailList"> <td><span wicket:id="fieldName">FIELD_NAME</span></td> <td><input type="text" size="50" maxlength="100" wicket:id="productDetailField"/></td> </tr> <tr valign="top"> <td></td> <td><input type="submit" value="Edit" class="Button" /></td> </tr> </table> </form> === ProductEditForm.java === public class ProductEditForm extends Form { @EJB(name = "LearnWicketEJB/ProductService") private ProductService productService; private ListView productDetailList; public ProductEditForm(String componentName, final Product product) { super(componentName); this.product = product; this.add(productDetailList = new ListView("productDetailList", this.productService.getProductDetailsByProductId(product.getId())) { @Override protected void populateItem(final ListItem item) { final ProductDetail productDetail = (ProductDetail) item.getModelObject(); item.add(new Label("fieldName", productService.getField(productDetail.getFieldId()).getName() + " :")); item.add(new TextField("productDetailField", new PropertyModel(productDetail, "content"))); } }); } @Override public void onSubmit() { for (Object object : this.productDetailList.getModelObject()) { ProductDetail productDetail = (ProductDetail) object; this.productService.updateProductDetail(productDetail.getProductId(), productDetail.getFieldId(), productDetail.getContent(), productDetail.getNotApplicable()); } this.setResponsePage(new ProductConfirmation(ProductConfirmation.CONFIRMATION_TYPE_EDIT)); } } === End of Code === I've realized that the ListView in the form generate unique field name (which is exactly what I need) : <tr valign="top"> <td><span>Manufacturer :</span></td> <td><input type="text" size="50" maxlength="100" value="Intel" name="productDetailList:0:productDetailField"/></td> </tr> <tr valign="top"> <td><span>Series :</span></td> <td><input type="text" size="50" maxlength="100" value="Core i7" name="productDetailList:1:productDetailField"/></td> </tr> <tr valign="top"> <td><span>Core Name :</span></td> <td><input type="text" size="50" maxlength="100" value="Bloomfield" name="productDetailList:2:productDetailField"/></td> </tr> ... etc etc etc ... Is this good enough? Well, at least this works and simple enough to me... Anyone has better solutions?