JPA сопоставляет карту

#java #hibernate #jpa

Вопрос:

Я пытаюсь сопоставить сущность с картой типов @Embeddable, где одно из полей @Embeddable является ключом.

 @Entity @Table(name = "client_profile") public class ClientProfile implements Serializable {   @Id  @Column(name = "id")  @Type(type = "pg-uuid")  private UUID id = UUID.randomUUID();   @ElementCollection  @CollectionTable(name = "org_risk_config", joinColumns = @JoinColumn(name = "profile_id"))  @MapKeyJoinColumn(name = "risk_level")  private Maplt;RiskLevel, OrgRiskConfiggt; riskLevels = new HashMaplt;gt;(); }  

Где уровень риска-это перечисление, а OrgRiskConfig выглядит так:

 @Embeddable  @Table (name = "ORG_RISK_CONFIG")  public class OrgRiskConfig implements Serializable {   @Enumerated (EnumType.STRING)  @Column(name = "risk_level", nullable = false)  @NotNull  private RiskLevel riskLevel;   @NotEmpty  @Column(name = "display_name", nullable = false)  private String displayName;  ...  }   

К сожалению, это приводит меня к этой ошибке: org.hibernate.MappingException: Repeated column in mapping for collection: com.visotrust.viso.domain.ClientProfile.riskLevels column: risk_level

Я попробовал это с помощью @MapKeyJoinColumn, и он хочет иметь еще одну колонку: Schema-validation: missing column [org_control_configs_key] in table [org_control_config] чего я не хочу.

Ранее я работал с внедренными типами в качестве сущностей @MapKey(name = "riskLevel") , и я могу вернуться к этому, но они имеют больше смысла как встроенные.

Кто — нибудь знает, как я могу это отобразить?

Комментарии:

1. Столбец MapKeyJoinColumn предназначен для определения столбца соединения, когда ключом карты является сущность — разве вы не говорите, что уровень риска-это перечисление? Перечисления похожи на основы — им просто нужен столбец для хранения значения, а не определение внешнего ключа/столбца соединения. Вместо этого используйте @MapKey здесь.