【问题标题】:Map Varchar column type to Integer in entity jpa将 Varchar 列类型映射到实体 jpa 中的整数
【发布时间】:2020-08-27 02:33:08
【问题描述】:

我有一个旧表,其中一个列的类型是 varchar,但里面有所有数字。我不想更改表中的数据类型。我想更改实体中的列数据类型。

之前它是字符串,现在我将其更改为整数,并且 crud 操作工作正常。这是很好的做法还是有其他方法可以做到?示例代码:

之前:

@Entity
public class TestEntity{
    @Column(name = "Test")
    private String test;
}

现在:

@Entity
public class TestEntity{
    @Column(name = "Test")
    private Integer test;
}

【问题讨论】:

  • 你之前和之后的代码是一样的。

标签: java hibernate jpa spring-data hibernate-mapping


【解决方案1】:

创建一个AttributeConverter,用于数据库到实体类型的转换

@Converter
public class IntegerToStringConverter implements AttributeConverter < Integer,
 String > {
  @Override
  public String convertToDatabaseColumn(Integer value) {
   return Integer.toString(number);
  }

  @Override
  public Integer convertToEntityAttribute(String number) {
   try {
    return Integer.parseInt(number);
   } catch (Exception e) {
    throw new IllegalStateException("Invalid number: " + value);
   }
  }
 }

并在您的专栏中使用它

@Convert(converter = IntegerToStringConverter.class)
@Column(name = "Test")
private Integer Test;

【讨论】:

  • 我没有使用任何转换器,我只是更改了数据类型,并且它的 crud 工作正常。我还需要为该列制作显式转换器吗?
  • 您能否检查此列的数据是否正确保留?仅更改数据类型可能不起作用。使用此列的各种数据
  • 是的,我检查过数据是否正确保存。我尝试了 null,并且不使用任何转换器,各种数字及其持久性和读取都很好
  • 如果列中有一些数据无法解析为 Integer,则 jpa 将抛出异常,要明确处理这种情况,我需要实现 Converter。
  • 是的,也许是 Jpa 自动装箱,但要处理您需要的异常。
【解决方案2】:

您可以通过 getter/setter 对数据库中的字段进行解析,并将@Transient 注解应用于整数属性。

@Entity
public class TestEntity {
    @Column(name = "test") 
    private  String getTest() {
        return String.valueOf(this.intTest);
    }

    private void setTest(String test) {
        try {
            this.intTest = Integer.parseInt(test);
        } catch (NumberFormatException e) {
            this.intTest = 0;
        }
    }

    @Transient
    private int intTest;

    public int getIntTest() { return intTest; }

    public void setIntTest(int test) {
        this.intTest = intTest;
    }
}

【讨论】:

    猜你喜欢
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 2012-07-04
    相关资源
    最近更新 更多