【问题标题】:How to map an entity as java.util.Map with spring Data JPA?如何使用spring Data JPA将实体映射为java.util.Map?
【发布时间】:2020-02-21 13:54:05
【问题描述】:

我有这样的实体:

Bonus_Request 实体:

@Entity
@Table(name = "bonus_request")
public class BonusRequest {

    //some code above...

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "bonusRequest")
    @JsonManagedReference(value = "parameter-bonus_request")
    private Set<BonusRequestParameter> parameters;
}

Bonus_Request_Parameter 实体:

@Entity
@Table(name = "bonus_request_parameter")
public class BonusRequestParameter {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Size(max = 30)
    @Column(name = "parameter", nullable = false)
    private String parameter;

    @Size(max = 50)
    @Column(name = "value", nullable = false)
    private String value;

    @JoinColumn(name = "bonus_request_id", nullable = false)
    @ManyToOne(fetch = FetchType.LAZY)
    @JsonBackReference(value = "parameter-bonus_request")
    private BonusRequest bonusRequest;

}

我想知道是否可以将 BonusRequestParameter 实体映射为 BonusRequest 实体中的 java.util.Map 字段。

例如:

@Entity
@Table(name = "bonus_request")
public class BonusRequest {

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "bonusRequest")
    private Map<String, String> parameters; //String parameter, String value
}

我用:

  1. Spring Data JPA - 2.1.7
  2. PostgreSQL 数据库 - 10.7

【问题讨论】:

  • 实体编号您可以使用映射吗,是的,使用@ElementCollection 并为key.value 等提供映射。但是看起来这也有一个单独的主键@ElementCollection 将不起作用,因为插入时不会生成一个主键。因此,除非您可以放弃该列并将bonus_request_idparameter 列设为复合键(或唯一键),否则它将不起作用。 \
  • 它也可以映射为私有Map&lt;String, BonusRequestParameter&gt;,详见此处:stackoverflow.com/questions/25439813/… 和此处en.wikibooks.org/wiki/Java_Persistence/…

标签: spring postgresql spring-data-jpa mapping


【解决方案1】:

这会奏效。默认情况下它会急切地加载地图。

@Entity
@Table(name = "bonus_request")
public class BonusRequest {

    ...

    @ElementCollection
    private Map<String, String> parameters; //String parameter, String value
}

【讨论】:

    【解决方案2】:

    已解决:

    @ElementCollection(fetch = FetchType.EAGER)
    @CollectionTable(name = "bonus_request_parameter",
    joinColumns = {@JoinColumn(name = "bonus_request_id", referencedColumnName = "id")})
    @MapKeyColumn(name = "parameter")
    @Column(name = "value")
    private Map<String, String> parameters;
    

    感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-22
      • 2023-03-18
      • 2021-09-02
      • 2017-11-01
      • 2018-11-25
      • 2015-04-11
      • 1970-01-01
      • 2021-03-30
      相关资源
      最近更新 更多