我的数据库在一个名为Product
的表中包含产品,每个产品可能有特定的规格字段,例如
//Bicycle product
{
"name" : "Bicycle",
"category" : "Bicycles"
"specification" : {
"color" : "red"
}
}
//Wheel product
{
"name" : "Wheel",
"category" : "Spare Parts",
"specification" : {
"diameter" : "7.5"
}
}
所以我想出了在我的Product
实体中创建Map<String, String>
类型字段(创建另一个称为规范的表)以包含这些规范的想法。但是我不喜欢这种方法,因为所有额外的字段都是字符串类型,并且因为Spring将从这个字段创建一个bean,所以我不能将值的类型指定为抽象类(如Map<String, Object>
)。
我想创建额外的字段,像这样:
@ElementCollection
private Map<String, String> string_features;
@ElementCollection
private Map<String, Double> double_features;
// ...
但是它看起来有点丑,我认为有更好的方法。而且,如果规格字段是不同的实体类型,我将不得不为该特定实体创建另一个映射,例如
//Bicycle product
{
"name" : "Bicycle",
"category" : "Bicycles"
"specification" : {
"color" : "red",
"wheel" : {
"name" : "Wheel",
}
}
}
如果值只能是数字和字符串,也许您可以将值保存为字符串,然后在返回值之前使用正则表达式检查字符串是否为数字。
否则,您需要一种识别类型的方法。我想我应该把它改成:
//Bicycle product
{
"name" : "Bicycle",
"category" : "Bicycles"
"specifications" : [
{ name: "color", value: "red", type: "string"},
{ name: "diameter", value: "7.5", type: "double"},
...
]
}
可以映射为:
@ElementCollection
private List<Specification> specifications;
...
@Embaddable
class Specification {
String name;
String value;
String type;
// ... getter/setter and everything else
@Transient
Object getConvertedValue() {
if ("double".equals(type)) {
return Double.parse(value);
}
// String is the default
return value;
}
}
好处是你可以有任意多的类型。