【问题标题】:JPA: mapping a java.util.Map to a single tableJPA:将 java.util.Map 映射到单个表
【发布时间】:2021-03-30 13:08:00
【问题描述】:

因此,基本上,我正在尝试为我的应用程序的全局、系统范围的配置实现一个简单的键值存储,为此,我想将整个 java.util.Map 映射到数据库中的单个表?所以,例如:

// initialization

globalConfig.put("property1", "130")
globalConfig.put("property2", "abc")
globalConfig.put("propertyXY", "0")

映射到:

GLOBAL_CONFIG:

| key        | value |
|------------|-------|
| property1  | 130   |
| property2  | abc   |
| propertyXY | 0     |

有没有使用 JPA / Hibernate 实现这一点的干净简单的方法?

【问题讨论】:

  • 这能解决你的问题stackoverflow.com/questions/4371384/… 吗?
  • @Shawrup 嗯...不,不是真的
  • 为什么不将List<ConfigEntry>@Entity @Table(name="GLOBAL_CONFIG") public class ConfigEntry { @Column(name = "key") @Id private String key; @Column(name = "value") private String value; /* ctor, getters, setters, ... */ } 保持一致?

标签: java spring spring-boot hibernate jpa


【解决方案1】:

您必须将其映射为实体。像这样的:

@Entity
@Table(name="GLOBAL_CONFIG")
public class GlobalConfig {
    @Id
    private String key;
    private String value;
}

如果你想要一张地图,你必须通过例如将List<GlobalConfig> 转换为Map<String, String>。流操作大致如下所示:

interface GlobalConfigRepository extends Repository<GlobalConfig, String> {
    default Map<String, String> getMap() {
        return findAll().stream().collect(Collectors.toMap(GlobalConfig::getKey, GlobalConfig::getValue))
    }
}

【讨论】:

    【解决方案2】:

    如果这张地图对应一个表格,我认为你想要实现的,你需要加载所有条目并自己将其转换为地图。我不会把它放在数据层,最好为此提供服务。

    如果您想将地图存储在一个条目的列上,我认为您需要一个 JSON 字段,如此处 https://vladmihalcea.com/how-to-map-json-objects-using-generic-hibernate-types/ 或此处 https://bootify.io/docs/persist-json-with-spring-data-hibernate.html 所述。

    【讨论】:

      猜你喜欢
      • 2012-07-22
      • 2020-02-21
      • 1970-01-01
      • 2017-06-06
      • 2020-10-28
      • 2017-07-02
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      相关资源
      最近更新 更多