【问题标题】:How to map JPA OneToMany relationship when FK is part of CompositeId当 FK 是 CompositeId 的一部分时如何映射 JPA OneToMany 关系
【发布时间】:2022-11-13 07:28:20
【问题描述】:

所以我有一个预先存在的具有多个 OneToMany 关系的服务实体。现在我需要再添加一个,但我遇到了麻烦,我认为这一定是因为 Many 端使用了复合键。

我有带有新字段的 Service.java

@Column(name = "TRANSLATION_DV_ID")
private String translationDvId;

@OneToMany(cascade = CascadeType.All, fetch = FetchType.Eager, mappedBy = "service")
private List<Translation> translation;

@IdClass(TranslationId.class)
public class Translation {
 @Id
 @Column(name = "TRANSLATION_DV_ID")
 private String translationDvId;

 @Id
 @Column(name = "LOCALE_CD")
 private String localeCd;

 @Column(name = "TRANSLATED_NAME")
 private String translatedName;

 @Column(name = "TRANSLATED_DESC")
 private String translatedDesc;

 @ManyToOne
 @JoinColumn(name = "TRANSLATION_DV_ID", insertable = false, updatable = false)
 private Service service;

测试数据是用 sql 脚本生成的。我输入了新数据并匹配了 translationDvId。除了翻译关系之外,所有数据都包含正确的信息——每个服务总是有一个空的List&lt;Translation&gt;

我不确定我错过了什么,但这里是一个数据输入的例子

INSERT INTO SCHEMA.SERVICE(SERVICE_CD, TRANSLATION_DV_ID, etc, etc)
VALUES ('servicePrimaryKey', '12345', 'etc, 'etc);

INSERT INTO SCHEMA.TRANSLATION(TRANSLATION_DV_ID, LOCALE_CD, TRANSLATED_NAME, TRANSLATED_DESC)
VALUES ('12345', 'English', 'Guardian', 'Cool stuff');
INSERT INTO SCHEMA.TRANSLATION(TRANSLATION_DV_ID, LOCALE_CD, TRANSLATED_NAME, TRANSLATED_DESC)
VALUES ('12345', 'Spanish', 'Guardia', 'Cosas interesantes');

【问题讨论】:

    标签: java spring-data-jpa composite-primary-key


    【解决方案1】:

    @JoinColumn 有一个特殊属性,当被引用表中存在复合 PK 时 - referencedColumnName

    @OneToMany
    @JoinColumn(name = "TRANSLATION_DV_ID", referencedColumnName = "TRANSLATION_DV_ID")
    private List<Translation> translation;
    

    【讨论】:

      猜你喜欢
      • 2021-09-23
      • 2020-04-15
      • 2012-02-08
      • 2014-11-19
      • 1970-01-01
      • 2021-12-01
      • 2022-01-20
      • 2021-06-15
      • 2013-11-20
      相关资源
      最近更新 更多