首页 > 解决方案 > 使用 SpringData 存储地图

问题描述

我正在从 REST 服务(170~ 费率)获取以下 JSON

{
  "success":true,
  "timestamp":1527944949,
  "base":"EUR",
  "date":"2018-06-02",
  "rates":{
    "AED":4.284515,
    "AFN":83.084064,
    "ALL":124.882747,
    ....
  }
}

而且我想通过以下课程将其保留在我的数据库中

@Entity
@Table(name = "exchange_rate")
public class ExchangeRateEntity {

    @Id
    @Column(unique = true)
    private Date date;

    @ElementCollection
    @MapKeyColumn(name="name")
    @Column(name="value")
    @CollectionTable(name="rates", joinColumns=@JoinColumn(name="date"))
    private Map<String, Double> rates;

    //getters and setters
}

如果我理解正确,它应该用我想要的数据制作新表“费率”吗?但它结束了

MySQLSyntaxErrorException:表'currency_rate.rates'不存在

其中 currency_rate 是我的数据库名称

我试图改变为

@CollectionTable(name="exchange_rate", joinColumns=@JoinColumn(name="date"))

但它给了我

MappingException: 外键 (FK9s46rfp5jp46vm7ep4cbc020x:exchange_rate [date])) 必须具有与引用的主键相同的列数 (exchange_rate [date,name])

我很困惑,如何将地图存储在数据库中?

标签: javamysqlspringspring-data

解决方案


  1. 您可以尝试使用 Jackson 框架将 Json 数据转换为 POJO。

例子:

String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\" }";
Car car = objectMapper.readValue(json, Car.class);
  1. 只有当表“货币汇率”真实存在时,数据库中的记录才会创建。您可以写入spring.jpa.generate-ddl=false应用程序配置文件,然后表将自动创建。

  2. MappingException: Foreign key (FK9s4...由于不正确的实体关系而出错。但是你只写了一个实体。


推荐阅读