使用SpringData存储地图

时间:2018-06-02 15:20:02

标签: java mysql spring spring-data

我从REST服务中获取了JSON(170~rate)

{
  "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
}

如果我理解正确,它应该制作新表&#34; rate&#34;我想要的数据?但最终会以

结束
  

MySQLSyntaxErrorException:表&#39; currency_rate.rates&#39;不存在

其中currency_rate是我的数据库名称

我试图改为

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

但它给了我

  

MappingException:外键   (FK9s46rfp5jp46vm7ep4cbc020x:exchange_rate [date]))必须具有相同的   列数作为引用的主键(exchange_rate   [日期,名称])

我完全糊涂了,如何在数据库中存储地图?

1 个答案:

答案 0 :(得分:0)

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

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

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