0

我有一个包含两个字段的实体类。

@Entity(name = "additional_attributes")
class AdditionalAttributes {

  @Id
  private Integer id;
  private String attributeName;
  private Object attributevalue;

  // getter and setter
  // manytoone with mandatory table

}

attributeValue 的数据类型在这里是 Object,这意味着 value 可以是 integer/boolean/float 之类的任何东西。

如何处理这种情况以保存正确的值,并在获取时再次获得确切的值(布尔/整数等类型)?

4

1 回答 1

1

您应该添加attribute类标记字段Class<?> attributeClass。另一种方法是创建枚举AttributeType并将其用作标记字段

@Entity(name = "additional_attributes")
class AdditionalAttributes {

  @Id
  private Integer id;
  private String attributeName;

  Class<?> attributeClass;
  String attributevalue;

  public void setAttribute(Object attribute){
      attributeClass = attribute.getClass()
      attributevalue = attribute.toString();
  }
}

要设置属性,请使用:

Integer integerAttribute = 100;
additionalAttributes.setAttribute(integerAttribute);

Boolean booleanAttribute = true;
additionalAttributes.setAttribute(booleanAttribute);

然后有两种方法:

1)添加到实体或服务类公共attributeparcer

public Object getAttribute() throws NumberFormatException {
      if(attributeClass == Integer.class) {
          return Integer.parseInt(attributevalue);
      }

      if(attributeClass == Boolean.class) {
          return Boolean.parseBoolean(attributevalue);
      }

      //...
}

用法:

Object attribute = additionalAttributes.getAttribute();  

2)或者使用pair方法得到attribute

public boolean isIntegerAttribute() {
   return attributeClass == Integer.class;
}

public Integer getIntegerAttribute() throws NumberFormatException {
   return Integer.parseInt(attributevalue);
}  

public boolean isBooleanAttribute() {
   return attributeClass == Boolean.class;
}

public Boolean getBooleanAttribute() {
   return Boolean.parseBoolean(attributevalue);
}    

//...

用法:

if(additionalAttributes.isIntegerAttribute()) {
    Integer integerAttribute = additionalAttributes.getIntegerAttribute(); 
    //...
}

if(additionalAttributes.isBooleanAttribute()) {
    Boolean booleanAttribute = additionalAttributes.getBooleanAttribute(); 
    //...
}
于 2020-02-14T09:05:57.883 回答