我有一个实体,名称为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这样做,但我不知道该怎么做。 有人知道如何使用或任何可以帮助我。非常感谢你
答案 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>
,让服务器决定如何处理输入并映射到实际的域对象。