#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 здесь.