如何使用隐藏字段在wicket中存储数据模型

时间:2015-05-08 01:30:58

标签: wicket

我有一个实体,名称为Product.It有两个属性是unit(byte)和unitName(String)。 unit属性映射到数据库。例:0:Kg; 1:g; ....我想在输入有效单位时,存储单位属性;除非,它保存到unitName

产品

public class Product implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "product_id")
private int productId;

@Column(name = "product_name")
private String productName;

@Column(name = "unit")
private Byte unit;

@Transient
private String unitName;
}

在单位文本字段中,我使用UnitConvert

UnitConvert

public class UnitConverter implements IConverter<Byte> {

private static final long serialVersionUID = 4798262219257031818L;

public UnitConverter() {
}

@Override
public Byte convertToObject(String value, Locale locale) {
    return Text.isEmpty(value) ? 0 : UtilCommon.getTaniCode(value);
}

@Override
public String convertToString(Byte value, Locale locale) {
    return (value == null || value==0 ) ? "" : UtilCommon.getTaniName(value);
}
}

我只考虑HiddenField这样做,但我不知道该怎么做。 有人知道如何使用或任何可以帮助我。非常感谢你

1 个答案:

答案 0 :(得分:0)

所以根据我的理解,您希望将Model的输入保存到不同的数据库属性,具体取决于事先的某些检查。您可以使用Form.onSubmit()方法执行此操作。

一个非常简单的实现可能如下所示:

    public ProductPanel(String id, final IModel<Object> productModel) {
    super(id, productModel);
    // we're putting the productModel into the constructor. 
    // Therefore it's guaranteed to be detached
    // -> it's okay to have it with final modifier.

    IModel<String> formModel = Model.of("");

    Form<String> form = new Form<String>("form", formModel) {
        @Override
        protected void onSubmit() {
            super.onSubmit();
            String productName = getModelObject();

            Object realProduct = productModel.getObject();
            if (isAcceptableUnit(productName)) {
                realProduct.setUnit(parseUnit(productName));
            } else {
                realProduct.setUnitName(productName);
            }

            layer.saveProduct();
        }
    };
    add(form);

    TextField<String> productName = new TextField<String>("textField", formModel);
    form.add(productName);

}

private boolean isAcceptableUnit(String productName) {
    // your logic to determine if it's okay to cast to byte here...
    return true;
}

private byte parseUnit(String productName) {
    // your logic to parse the String to byte here...
    return 0;
}

一些额外的评论,因为我不确定你提供的代码片段是为了简单还是实际的代码片段:

您应该尽量避免声明db对象Serializable。如果你使用普通的Model对象保存你的DTO,wicket实际上会对它们进行序列化,你将无法对它们做任何事情(至少对hibernate来说)。 数据库对象应使用LoadableDetachableModel并保存主键以在其load()方法中加载实体。 这将使您现在可以使用CompoundPropertyModel等直接处理这些对象(具有它的优点和缺点,我将不在这里详细解释)。

在你的情况下,我会在表单中添加Model<String>,让服务器决定如何处理输入并映射到实际的域对象。