|
public class ProductForm extends ActionForm { private Long id; private Category category; ... public void reset(ActionMapping mapping, HttpServletRequest request) { super.reset( mapping, request ); if ( category == null ) { category = new Category(); } }
public void cleanupEmptyObjects() { if ( category.getId() == null ) { category = null; } } }
我们在copyProperties之前清理掉这些临时对象,所以如果ProductForm.category只是用来放Null的,则将ProductForm.category置为Null。然后Domain对象的category也会被设成null:
public class SaveProductAction extends Action { public final ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ) throws Exception { ... Product product = new Product(); ((ProductForm)form).cleanupEmptyObjects(); PropertyUtils.copyProperties( product, form ); SaveProduct( product ); ... } }
一对多关系
我还没有解决Category到Product的一对多关系。我们把它加入到Category的Metadata中:
public class Category { ... private Set products; ...
/** * @hibernate.set * table="PRODUCT" * lazy="true" * outer-join="auto" * inverse="true" * cascade="all-delete-orphan" * * @hibernate.collection-key * column="CATEGORY_ID" * * @hibernate.collection-one-to-many * class="Product" */ public Set getProducts() { return products; }
public void setProducts(Set products) { this.products = products; } }
注意:Hibernate的cascade属性为all-delete-orphan表明:Hibernate需要在存储包含的Category对象时候,自动存储Product对象。和parent对象一起存储child对象的情况并不常见,常见的是:分别控制child的存储和parent的存储。在我们的例子中,我们可以容易地做到这一点,如果我们允许用户在同一个html page编辑Category和ProductS。用set表示Products是非常直观的:本新闻共 6页,当前在第 4页 1 2 3 4 5 6 |